2023-03-18 リコウの毎日の質問

リンク:

https://leetcode.cn/problems/split-two-strings-to-make-palindrome/

タイトルの意味:

同じ長さの 2 つの文字列 a と b が与えられた場合、添字 k を選択し a を a1+a2 に、b を b1+b2 に変更します (添字 k を分離します)。

k は a1+b2 または b1+a2 を回文にし、a1、a2、b1、b2 は空の文字列にすることができるかどうかを答えてください。

ほどく:

a1+b2 または a2+b1 しかなく、新しい文字列の長さは元の文字列と同じでなければならないためです。

まず先頭と末尾の回文を照合し、次に照合できない部分が文字列に属し、この段落が回文になるはずです

つまり、文字列 abc には 3 つの部分があり、a+c は回文、b は回文です。

a と c が同じ文字列に属さない場合、b は任意の文字列に属すことができます

a と c が同じ文字列に属する場合、b はこの文字列にのみ属することができます

実際のコード:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
bool cl(string s,int l,int r)
{
    while(l<r&&s[l]==s[r])
    {
        l++;r--;
    }
    return l>=r;
}
bool solve(string a, string b)
{
    bool ans=0;
    
    int lga=a.size(),lgb=b.size();
    int left=0,right=lga-1;
    while(a[left]==b[right])
    {
        left++;right--;
        if(left>=right) return true;
    }
    ans = ans | cl(a,left,right) | cl(b,left,right);
    
    left=0,right=lga-1;
    while(b[left]==a[right])
    {
        left++;right--;
        if(left>=right) return true;
    }
    ans = ans | cl(a,left,right) | cl(b,left,right);
    
    return ans;
}
int main()
{
    string a,b;cin>>a>>b;
    bool ans=solve(a,b);
    cout<<ans<<endl; 
}

制限:

  • 1 <= a.length, b.length <= 105
  • a.length == b.length
  • aどちらbも小文字の英字のみを含みます

おすすめ

転載: blog.csdn.net/Fei_WuYan/article/details/129643768