Leetcode:1616. 分割兩個字串得到迴文串

sjmuvx發表於2020-10-12

1616. 分割兩個字串得到迴文串

題意:兩個等長的字串a、b,在同一個位置切割得到 a p r e f i x , a s u f f i x , b p r e f i x , b s u f f i x a_{prefix}, a_{suffix}, b_{prefix}, b_{suffix} aprefix,asuffix,bprefix,bsuffix , 組 合 得 到 ,組合得到 a p r e f i x + b s u f f i x 和 b p r e f i x + a s u f f i x a_{prefix} + b_{suffix}和b_{prefix} + a_{suffix} aprefix+bsuffixbprefix+asuffix兩個字串,這兩個字串中是否存在迴文串。

吐槽:競賽時沒有抓住題目的本質,在這裡吊了一小時(還是太菜了)


思路:迴文串的題目一定要抓本質,即迴文。有4種情況要討論:

  1. a的前半部分與b的後半部分匹配,某一處開始不能匹配
    1. a的前半部分+a的剩餘部分+b的後半部分能否構成迴文串
    2. a的前半部分+b的剩餘部分+b的後半部分能否構成迴文串
  2. b的前半部分與a的後半部分匹配,某一處開始不能匹配
    1. b的前半部分+a的剩餘部分+a的後半部分能否構成迴文串
    2. b的前半部分+b的剩餘部分+a的後半部分能否構成迴文串

程式碼

class Solution {
    public boolean checkPalindromeFormation(String a, String b) {
        return check(a, b) || check(b, a);
    }
    private boolean check(String a, String b){
        for(int i = 0, j = a.length() - 1; i < j; i++, j--){
            if(a.charAt(i) != b.charAt(j)){
                return extend(a, i, j) || extend(b, i, j);
            }
        }
        return true;
    }
    private boolean extend(String a, int l, int r){
        for(int i = l, j = r; i < j; i++, j--){
            if(a.charAt(i) != a.charAt(j))
                return false;
        }
        return true;
    }
}

相關文章