题目
输入 '333dddd4444fffff234' 输出连续出现次数最多的,和出现的次数
解题思路1
使用双循环的方式。
代码实现
interface strChar {
char: string
length: number
}
function findChar(str: string):strChar {
const length = str.length
const res: strChar = {
char: '',
length: 0
}
if (length===0) return res
let midlength = 0
for (let i=0;i<length;i++) {
midlength = 0
for (let j=i;j<length;j++) {
if (str[i] === str[j]) {
midlength++
}
if (str[i] != str[j] || j === length-1 ) {
if (res.length < midlength) {
res.char = str[i]
res.length = midlength
}
if (i< length-1) {
i = j-1
}
break
}
}
}
return res
}
上面代码中 使用了break 他会跳出当前层循环 想要 i=j 那么就要给他j-1 因为外面会给 i +1
复杂度分析
在这个双循环中, 因为外层循环中的i 是跟着J 跳着走的,所以,实际循环的次数就是字符串的长度 时间复杂度为O(n)
思路2 双指针
上面的嵌套循环也可以看作 两个指针, 一个是 i 一个是 j
代码实现
function findChar2(str: string): strChar {
const length = str.length
const res: strChar = {
char: '',
length: 0
}
if (length===0) return res
let j=0
let midlength = 0
for (let i=0; i<= length; i++) {
if (str[i] === str[j]) {
midlength++
}else {
if (res.length < midlength) {
res.char = str[j]
res.length = midlength
}
midlength = 0
j=i
i--
}
}
return res
}
复杂度分析
时间复杂度为O(n) 空间复杂度O(1)
其他方法
- 创建一个map 来记录每个字符串连续的次数,这样增加了空间复杂度O(n)。 时间复杂度 还是O(n), 不建议
- 算法中正则表达式的性能比较低