循环字符串
题目
给定两个字符串, s
和 goal
。如果在若干次旋转操作之后,s
能变成 goal
,那么返回 true
s
的旋转操作 就是将 s
最左边的字符移动到最右边。
例如, 若 s = 'abcde
’,在旋转一次之后结果就是'bcdea'
示例一
输入: s = "abcde", goal = "cdeab"
输出: true
示例二
输入: s = "abcde", goal = "abced"
输出: false
自己的解答
直接将s字符串进行旋转,旋转的操作是使用temp
来记录字符串的第一个字符,然后使用一个循环将所有的字符串都向前移动,最后将使最后一个字符=temp
代码使用两层循环,内层循环用于旋转字符串,外层循环用于判断旋转字符串何时停止,即当s==goal
或者count==s.length()
class Solution {
public:
bool rotateString(string s, string goal) {
int i,temp;
int count=0;
while(s!=goal&&count!=s.length()){
temp=s[0];
for(i=0;i<s.length();i++){
s[i]=s[i+1];
}
s[s.length()-1]=temp;
count++;
}
return s==goal;
}
};
结果
官方答案
官方的答案是先判断两个字符串长度是否一致,如果不一致,那么不管怎么旋转两个字符串都不会相同。
然后考虑旋转,同样采用了两层循环,主要使旋转部分并没有改变字符串s
,只是单纯计算旋转后的某一个字符
在长度一样(都为 n
)的前提下,假设 s
旋转 i
位,则与 goal
中的某一位字符 goal[j]
对应的原 s
中的字符应该为s[(i+j) mod n]
。在固定 i
的情况下,遍历所有 j
,若对应字符都相同,则返回 true
。否则,继续遍历其他候选的 i
。若所有的 i
都不能使 s
变成 goal
,则返回 false
。
class Solution {
public:
bool rotateString(string s, string goal) {
int m = s.size(), n = goal.size();
if (m != n) {
return false;
}
for (int i = 0; i < n; i++) {
bool flag = true;
for (int j = 0; j < n; j++) {
if (s[(i + j) % n] != goal[j]) {
flag = false;
break;
}
}
if (flag) {
return true;
}
}
return false;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/rotate-string/solution/xuan-zhuan-zi-fu-chuan-by-leetcode-solut-4hlp/
来源:力扣(LeetCode)
反思
- 没有考虑字符串长度不一致的情况
- 直接暴力求解