常用演算法之驗證迴文串

王鐵匠發表於2020-12-11

今天給大家分享一道面試中經常碰到的簡單演算法題目 - 檢測迴文串。

題目:

    給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。

示例1:

輸入: "A man, a plan, a canal: Panama"輸出: true

示例2:

輸入: "race a car"輸出: false

思路:

    利用雙指標。

    初始化兩個指標 i、j,i從字串左側開始,j從字串右側開始,我們每次將 i + 1,將 j - 1 判斷兩個字元是否相等,如果兩個指標能夠相遇就說明是迴文串,不然就不是迴文串。

Go程式碼示例

func isPalindrome(s string) bool {    // 將字串轉為小寫    s = strings.ToLower(s)    // 定義兩個初始化指標    i, j := 0, len(s) - 1    // 當 i >= j 時兩個指標相遇說明是迴文    for i < j {        // 非字母h或數字s時左側指標加一繼續迴圈        if !isanum(s[i]) {            i++            continue        }        // 非字母h或數字s時右側指標減一繼續迴圈        if !isanum(s[j]) {            j--            continue        }        // 當對稱字元不想等說明不是迴文        if s[i] != s[j] {            return false        }        i++        j--    }    return true}
func isanum(x byte) bool {    return (x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z') || (x >= '0' && x <= '9')}

複雜度分析

  • 時間複雜度:O(n)O(∣s∣)

  • 空間複雜度:O(1)

相關文章