Thema
Rufen Sie die meisten aufeinanderfolgenden Zeichen und Zeiten in einer Zeichenfolge ab, z. B.:
aaabbccd
Die längste Zeichenfolge ist a, die Häufigkeit beträgt 3.
Verschachtelte Schleifen – Überspringen
Dies ist eine verschachtelte Schleife zum Überspringen, und die Zeitkomplexität beträgt O(n), nicht O(n^2).
Beim Überqueren:
- i zeigt nacheinander auf das erste a, das erste b, das erste c und das erste d
- j zeigt auf die Rückseite des ersten a, die Rückseite des ersten b, die Rückseite des ersten c und die Rückseite des ersten d
Die Komplexität ist also O(n)
interface IRes {
char: string
length: number
}
/**
* 求连续最多的字符和次数(嵌套循环)
* @param str str
*/
export function findContinuousChar1(str: string): IRes {
const res: IRes = {
char: '',
length: 0
}
const length = str.length
if (length === 0) return res
let tempLength = 0 // 临时记录当前连续字符的长度
// O(n)
for (let i = 0; i < length; i++) {
tempLength = 0 // 重置
for (let j = i; j < length; j++) {
if (str[i] === str[j]) {
tempLength++
}
if (str[i] !== str[j] || j === length - 1) {
// 不相等,或者已经到了最后一个元素。要去判断最大值
if (tempLength > res.length) {
res.char = str[i]
res.length = tempLength
}
if (i < length - 1) {
i = j - 1 // 跳步
}
break
}
}
}
return res
}
Doppelzeiger
- j bewegt sich nicht, i bewegt sich vorwärts
- Wenn die Werte von i und j immer gleich sind, bewegt sich i weiter
- Bis die Werte von i und j nicht gleich sind, zeichnen Sie sie auf und lassen Sie j mit i aufholen. Fahren Sie mit dem ersten Schritt fort
/**
* 求连续最多的字符和次数(双指针)
* @param str str
*/
export function findContinuousChar2(str: string): IRes {
const res: IRes = {
char: '',
length: 0
}
const length = str.length
if (length === 0) return res
let tempLength = 0 // 临时记录当前连续字符的长度
let i = 0
let j = 0
// O(n)
for (; i < length; i++) {
if (str[i] === str[j]) {
tempLength++
}
if (str[i] !== str[j] || i === length - 1) {
// 不相等,或者 i 到了字符串的末尾
if (tempLength > res.length) {
res.char = str[j]
res.length = tempLength
}
tempLength = 0 // reset
if (i < length - 1) {
j = i // 让 j “追上” i
i-- // 细节
}
}
}
return res
}