反过来考虑将 B 变换成 A 简便很多。看别人代码学到 multiset 的一个用法,很方便。
代码:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define CHECKTIME() printf(%.2lf , (double)clock() / CLOCKS_PER_SEC) /*************** Program Begin **********************/ class LittleElephantAndString { public: bool searchstr(string str, string seastr)// 判断 seastr 是否是 str 的子序列 { int p1, p2; p1 = p2 = 0; for (; p2 < seastr.size(); p2++, p1++) { for (; p1 < str.size(); p1++) { if (seastr[p2] == str[p1]) { break; } } if (p1 == str.size()) { return false; } } return true; } int getNumber(string A, string B) { int res = 0; if ( multiset (A.begin(), A.end()) != multiset (B.begin(), B.end()) ) { return -1; } int n = A.size(); res = n; string nextB; for (int i = 0; i < n; i++) { nextB = B.substr(i, n - i); if (searchstr(A, nextB)) { res = i; break; } } return res; } }; /************** Program End ************************/