题目

图片.png

题解

1、类似循环队列的意思

每次逻辑上移动s的一个头到尾去,i代表移动了几个,j代表依次比较
然后进行比较s[(i + j) % n] != goal[j]

  1. class Solution {
  2. public:
  3. bool rotateString(string s, string goal) {
  4. int m = s.size(), n = goal.size();
  5. if (m != n) {
  6. return false;
  7. }
  8. for (int i = 0; i < n; i++) {
  9. bool flag = true;
  10. for (int j = 0; j < n; j++) {
  11. if (s[(i + j) % n] != goal[j]) {
  12. flag = false;
  13. break;
  14. }
  15. }
  16. if (flag) {
  17. return true;
  18. }
  19. }
  20. return false;
  21. }
  22. };

2、 Kmp复习

就是将s的首尾相连,构成一个长字符串,然后对goal进行kmp匹配

  1. class Solution {
  2. public:
  3. bool rotateString(string s, string goal) {
  4. //长度不同肯定错
  5. if (s.size() != goal.size())return false;
  6. //首尾相连,我直乎nb
  7. s += s;
  8. vector<int> next = get_next(goal);//获取到了next
  9. //i代表长的s,j代表短的goal
  10. int i = 1, j = 1;
  11. //位置小于且等于长度,继续
  12. while (i <= s.size()&&j <= goal.size()) {
  13. if (j == 0 || s[i-1] == goal[j-1]) {
  14. i++; j++;
  15. }
  16. else {
  17. j = next[j];//回溯
  18. }
  19. }
  20. if (j > goal.size()) {//goal匹配完了,说明都在
  21. return true;
  22. }
  23. else {
  24. return false;
  25. }
  26. }
  27. vector<int> get_next(string T) {
  28. int i, k;
  29. int n = T.size();
  30. vector<int> next(n+1);//第0为为空,且要保证存储size个
  31. i = 1; k = 0;
  32. next[i] = 0;
  33. while (i < n) {
  34. if (k == 0 || T[i - 1] == T[k - 1]) {//字符串从1开始匹配便于观察,但是实际上要减去
  35. i++; k++;
  36. next[i]=k;
  37. }
  38. else {
  39. k = next[k]; //回溯
  40. }
  41. }
  42. return next;
  43. }
  44. };