开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
前言
本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。
- 今天还是来看一下字符串相关的知识以及题目 Leetcode 剑指 Offer 58 - II. 左旋转字符串 ,125. 验证回文串,459. 重复的子字符串
Leetcode 剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
解题
题目比较简单,我们可以通过字符串转为数组,然后来操作数组,利用数组的反转方法 reverse 我们可以直接反转整个数组,然后以n为分界线,对前后的元素进行反转,反转完以后就会变回正常排序,以此来完成部分字符移到尾部的操作。
function reverseLeftWords(s: string, n: number): string {
let arr = s.split('')
return [...arr.slice(0,n).reverse(), ...arr.slice(n,arr.length).reverse()].reverse().join('')
};
Leetcode 125. 验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
解题
根据题意进行模拟,通过字符串方法以及数组方法,将所有字符转为小写并且移除处理字母数字以外的所有特殊字符和空格,然后利用双指针前后遍历,判断每次遍历的位置是否相等。
function isPalindrome(s: string): boolean {
let arr = s.toLowerCase().split('')
arr = arr.filter(item=>(64 < item.charCodeAt(0) && item.charCodeAt(0) < 91 || 96 < item.charCodeAt(0) && item.charCodeAt(0) < 123 || 47 < item.charCodeAt(0) && item.charCodeAt(0) < 58))
let l = 0
let r = arr.length-1
while(l<r) {
if(arr[l] != arr[r]) return false
l++
r--
}
return true
};
Leetcode 459. 重复的子字符串
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 s 由小写英文字母组成,并且长度不超过 10000
示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。
解题
当一个字符串可以由多个子串组成的时候,假设为 'asdasd' 那么这是最少的一种情况,也就是两个 'asd' 相拼接,当我们把两个 字符串 'asdasd' 拼起来的时候,就会发现。
由于它的可组成的特性,中间又会生成一个新的 'asdasd' 当然对于更多的相同字符串组合也是一样的,所有我们就可以通过这个来判断,注意要删除拼接后字符串的第一个字符和最后一个字符,以免匹配到原有的 'asdasd' .
function repeatedSubstringPattern(s: string): boolean {
let n = s.length
let str = s.substr(1,n) + s.substr(0,n-1)
return str.includes(s)
};