Algorithmus: Holen Sie sich die meisten aufeinanderfolgenden Zeichen und Zeiten in einer Zeichenfolge – überspringen Sie den Doppelzeiger mit verschachtelter Schleife

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).
Fügen Sie hier eine Bildbeschreibung ein
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
 }

おすすめ

転載: blog.csdn.net/weixin_43972437/article/details/130332010