一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
前言
今天的题目为简单,题目是简单,但是也是简单题并不简单,通过暴力解法很容易就能够的到答案,但是能否节省时间复杂度以优的解答方法获得答案,这才是简单题需要追求的。
每日一题
今天的题目是 796. 旋转字符串,难度为简单
-
给定两个字符串, 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 由小写英文字母组成
题解
暴力解法
最直接的暴力解法,通过每次去把 s 字符串进行旋转,之后和目标字符串进行对比,相等就返回true,一直到旋转了 s 字符串的长度 那么多次之后都没有碰到相等的情况,那就返回 false。
对于字符串的旋转,我们可以把最后一个字符加上第一个到倒数第二个进行拼串
/**
* @param {string} s
* @param {string} goal
* @return {boolean}
*/
var rotateString = function (s, goal) {
let n = s.length;
for (let i = 0; i < n; i++) {
s = s[s.length - 1] + s.substr(0, s.length - 1);
if (s == goal) {
return true;
}
}
return false;
};
搜索子字符串
将两个s字符串拼在一起就会发现,s旋转的所有情况都会包含在这个字符串当中:
所以我们就能够把题目要求的旋转后去求得是否相等,转为去求 goal 是不是 s 的子字符串。
但是要注意一点,在通过旋转的解法是不用去在意两个字符串的长度的,因为需要两个字符串严格相等,但是用过求得子字符串这种方式,就需要去判断两个字符串的长度是否相等,否则比如像上面的字符串 ‘asd’ 就会出现 ‘asda’ 是两个 asd 拼接后的子字符串,但是并不满足题目的要求,所以还需要两个字符串长度相等。
/**
* @param {string} s
* @param {string} goal
* @return {boolean}
*/
var rotateString = function(s, goal) {
if(s.length != goal.length){
return false
}else{
return (s + s).includes(goal)
}
};