原文链接:796. 旋转字符串 - 力扣(LeetCode)
题目
给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作是将 s 最左边的字符移动到最右边。
例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。
示例 1:
输入: s = "abcde", goal = "cdeab"
输出: true
示例 2:
输入: s = "abcde", goal = "abced"
输出: false
提示:
1 <= s.length, goal.length <= 100
s 和 goal 由小写英文字母组成
题解
方法一:首位相连
class Solution {
public boolean rotateString(String s, String goal) {
return s.length()==goal.length()&&(s+s).contains(goal);
}
}
方法二:KMP算法
class Solution {
public boolean rotateString(String s, String goal) {
if (s.length() != goal.length())return false;
String str = new StringBuilder().append(s).append(s).toString();
return indexOf(str,goal) == -1 ? false:true;
}
public int indexOf(String str,String pattern){
if (pattern.length() == 0 )return 0;
int m = str.length();
int n = pattern.length();
str = " "+str;
pattern = " "+pattern;
int [] next = new int[n + 1];
for (int i = 2 ,j = 0 ;i < n+ 1;i++){
while (j > 0 && pattern.charAt(i) != pattern.charAt(j + 1) )j = next[j];
if (pattern.charAt(i) == pattern.charAt(j+1))j++;
next[i] = j;
}
for (int i = 1 , j = 0 ;i < m + 1;i++){
while(j > 0 && str.charAt(i) != pattern.charAt(j+1))j = next[j];
if (str.charAt(i) == pattern.charAt(j+1))j++;
if (j == n)return i - n ;
}
return -1;
}
}