Я немного почистил ваш код и позволил нам go показать то, что я заметил:
#include <iostream>
#include <string>
using namespace std;
Лично я бы избежал возвращаемых значений, основанных на вопросительных знаках, в коде, потому что они не так удобочитаемы , но это всего лишь предложение.
string max(string x, string y)
// Return biggest string
{
if (x.size() <= y.size())
return y;
else
return x;
}
string find(string x, string y)
// Find longest Sub Sequence
{
int xSize = x.size();
int ySize = y.size();
Допустим, обе строки были "AB C". Теперь второй оператор if вернет поиск по вызову AB, который вернет поиск по вызову A, который вернет «» как самую длинную подстроку A и A, в результате чего «» будет самой длинной подстрокой для AB C и AB C. Думаю, вы не после этого.
if (xSize == 0 || ySize == 0)
return "";
Вот почему я адаптировал второе утверждение if к тому, что вы имели в виду, вероятно. Здесь вы стирали последний символ, затем добавляли второй последний символ назад; Я не уверен, должно ли это быть, но так как y [последний] равен x [последний], добавление y после удаления его последнего с последним символом x - это сам y.
else if (x[xSize - 1] == y[ySize - 1])
return find(x.erase(xSize - 1), y);
Тогда эта переменная использовалась только один раз: char temp = x[xSize - 1]
. Возможно, вы захотите написать это в строке, поэтому вам не нужно создавать переменную и комментировать, если это необходимо; но это всего лишь настройки стиля кода.
else
return max(find(x, y.erase(ySize - 1)), find(x.erase(xSize - 1), y));
}
int main()
{
string x = "ABCBDAB";
string y = "BDCABA";
cout << "result = " << find(x, y) << endl;
return 0;
}
Попробуйте немного структурировать свой код, а теперь уточните алгоритм, потому что в нем есть некоторые ошибки алгоритма. Гудлак!