parinaz mellatdoust Ответов: 2

Сравните 2 строки с порядком


Я хочу получить две строки(s1,s2) от пользователя и проверить, существует ли s1 в s2.
Я написал код ниже. он находит строки, но его не волнует порядок букв.
как я могу изменить его так что например
s1="abcd"
s2="ooabzzzzzzcd"

он должен сказать "да", и он это делает.
s1="aczzzzzzzzbd"

он должен сказать нет но это не так
кроме того, я хочу, чтобы это было так, если буква используется дважды, она не путает порядок, например
s1="mammid"
s2="ammizzzzd"

моя программа скажет да в этом состоянии

ПС. Я использовал s3 и поставил "x" в первую очередь, чтобы поместить строку, которую я получаю от сравнения, в другую строку.Я поставил "x" в первую часть s1 в конце концов, чтобы не было никаких проблем

#include <iostream>
#include <string>
using namespace std;
int main()
{
	std::string s1;
	std::string s2;
	std::string s3="x ";	
 
	int x,y=0,i,cow;
 
	std::getline(std::cin, s1);
 
	std::getline(std::cin, s2);
 
	for ( cow = 0; cow < s2.size(); cow++)
	{
		for( i=cow;i<s2.size();i++){
			if (s1[cow] == s2[i]){
				s3=s3+s2[i];
				cout<<s3<<endl;
				break;
			}
			
			
     	}
	}
	//the problem is with the part on top
	s1="x "+s1;
 
	if (s1 == s3)
		std::cout << "YES";
 
	if (s1 != s3)
		std::cout << "NO";
 

	return 0;
}


Что я уже пробовал:

Я перепробовал все, что знал, но ничего не вышло.Я действительно застрял. Я был бы очень благодарен за любую помощь.

2 Ответов

Рейтинг:
2

Patrice T

Вам не нужен s3.
проблема заключается в вашем анализе.
Когда вы ищете заданную букву из маленькой строки, она может быть в длинной строке только после совпадения предыдущей буквы. Ваш код не гарантирует, что буквы находятся в порядке.
для "abcd"
"Азбука": матч
"abdc": провал
"xxxdcba": сбой из-за неправильного порядка
"xaxxbxcxd": совпадение
Вы должны изменить код ib, чтобы отслеживать совпадение предыдущей буквы.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

Jochen Arndt

Вам просто нужно найти текущий символ из совпадающей строки, где начальная позиция поиска находится позади последнего совпадения (изначально начало строки).

Непроверенный пример:

bool IsMatching(const std::string& s1, const std::string& s2)
{
    const char *str = s2.c_str();
    const char *match = s1.c_str();
    while (*match && str)
    {
        // Next occurence of current char from match
        str = std::strchr(str, *match);
        if (str)
        {
            // Continue search behind match
            str++;
            // Search for next character (break if this was the last one)
            match++;
        }
    }
    // Found match inside str when at the end of match
    return !*match;
}