字符串算法小合集
一:互为旋转词
如果一个字符串str,把字符串str前面的任意部分挪到后面去形成的字符串叫做str的旋转词。
比如:1234 旋转词: 2341 3412 4123
给定两个字符串a和b,判断a和b是否互为旋转词。
算法:
1)首先判断长度
2)构建一个新的字符串 a+a 如果b是a+a字符串的子串,那么就互为旋转词。时间复杂度为O(N)

#include<string> using std::string; class Rotation { public: bool chkRotation(string A, string B){ if (A.size() != B.size()) return false; //如果长度不同,显然不是旋转词 else{ string temp = A + A; if (temp.find(B) != string::npos) //如果B是temp(A+A)的子串,那么A和B互为旋转词 return true; else return false; //否则不是 } } };
二:单词间做逆序调整
pig loves dog —>dog loves pig
I am a student. —> student. a am I
1.利用容器,把每个单词当作一个元素,逆序排序即可
2.构造一个函数f对string进行逆序,先将整个string逆序,再将局部单词逆序

int main() { Reverse R; string str = "dog loves pig"; cout << str.size() << endl; R.f(str, 0, str.size() - 1); //将整个字符串逆序 cout << str << endl; int curr= 0; for (auto i = 0; i != str.size() - 1; ++i){ //将整个字符串用空格分隔 if (str[i] == ' '){ R.f(str, curr, i-1); //把每个子串逆序 curr = i+1; } } R.f(str, curr, str.size() - 1); //记得逆序最后一个空格后的单词 cout << str << endl; system("pause"); return 0; } #include<string> using std::string; #include<iostream> using std::cerr; using std::endl; class Reverse { typedef string::size_type sz; public: void f(string &A,sz i,sz j){ if (i > j || j > A.size() - 1 || i < 0){ cerr << "wrong subscript" << endl; } else{ while (i < j){ std::swap(A[i], A[j]); ++i; --j; } } } };
posted on 2016-12-14 09:35 ToBeAprogrammer 阅读(153) 评论(0) 收藏 举报
浙公网安备 33010602011771号