3 . (全排列)输入一个字符串,打印出该字符串中字符的所有排列。
待续.....
1 . 《变位词问题》好像经常考察到,思路很简单,先将字符串按照字母表排序,排序后得到的字符串作为该单词的标识(标识相同的就是变位词)。然后再将所有字符串按其标识的顺序排序即可。这里给一段参考代码:
#include<iostream> #include<algorithm> #include<string> using namespace std; /* 二元谓词 */ bool cmp(string s1, string s2){ sort(s1.begin(), s1.end()); // 默认升序 sort(s2.begin(), s2.end()); return s1 < s2; // string支持比较操作 } int main() { string s[] = {"army","abc","zero","mary","zore","bac"}; sort(s, s+6, cmp); // 使用自定义的比较操作 for(int i=0; i<6; ++i) cout << s[i] << " "; return 0; }
原理如上图所示,将字符串S翻倍得到新字符串,然后从第二个字符开始用S去匹配这个新字符串,如果返回位置小于S的长度,返回true,等于S的长度返回false。参考代码:
#include<iostream> #include<algorithm> #include<string> using namespace std; bool func(string s) { string new_s = s + s; if(new_s.find(s, 1) == s.length()) return false; else return true; }