Leetcode 796 旋转字符串——每日一题(4/7)题解【暴力模拟+字符串搜索】
文章目录
前言
刚刚A了今天的题目,只想到了字符串拼接的模拟法。看了题解才知道可以用搜索。
本题为leetcode的796题,旋转字符串 - 旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)
有兴趣的可以点击链接挑战一下。
题目内容
描述
给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作 就是将 s 最左边的字符移动到最右边。
例如, 若 s = ‘abcde’,在旋转一次之后结果就是’bcdea’ 。
示例
输入: s = "abcde", goal = "cdeab"
输出: true
输入: s = "abcde", goal = "abced"
输出: false
提示
1 <= s.length, goal.length <= 100
s
和goal
由小写英文字母组成
题解思路
解法1暴力模拟
我们可以很容易想到遍历字符串,用下标分割字符串,然后再重新拼接,和目标字符串比较。
当然,细节的话,可以先比较长度是否相等,如果不等直接排除。
code(C++)
#include<iostream>
#include<string>
using namespace std;
class Solution
{
public:
/// <summary>
/// 模拟
/// 遍历下标,以当前下标分隔成两部分重新拼接,然后和goal比较
/// </summary>
/// <param name="s"></param>
/// <param name="goal"></param>
/// <returns></returns>
bool rotateString(string s, string goal)
{
// 先判断长度, 如果不等直接false
if (s.length() != goal.length())
{
return false;
}
int n = s.length();
// 如果相等,则遍历下标
for (int i = 0; i < n; ++i)
{
// 根据下标重新拼接字符串
string str = s.substr(i + 1, n - i) + s.substr(0, i + 1);
if (str == goal)
{
return true;
}
}
// 遍历完都没有,那肯定不行拉,直接返回false
return false;
}
};
int main(int argc, char** argv)
{
string s, goal;
cin >> s >> goal;
Solution sol;
if (sol.rotateString(s, goal))
{
cout << "Yes!" << endl;
}
else
{
cout << "No!" << endl;
}
return 0;
}
解法2字符串搜索
看了题解才感慨我真的是**,居然没想到。
我们可以将字符串s 和s直接拼接,然后查找是否存在goal的子串即可,这不是一行代码的事情吗?简洁而又快速。
code(C++)
#include<iostream>
#include<string>
using namespace std;
class Solution
{
public:
// 字符串搜索
// 直接两个s拼接然后判断是否能够找到goal
bool rotateString(string s, string goal)
{
// 一行代码解决
return (s.length() == goal.length()) && (s + s).find(goal) != string::npos;
}
};
int main(int argc, char** argv)
{
string s, goal;
cin >> s >> goal;
Solution sol;
if (sol.rotateString(s, goal))
{
cout << "Yes!" << endl;
}
else
{
cout << "No!" << endl;
}
return 0;
}
后话
今天断更了,呜呜呜,效率太低了。