TOJ274

題敘

https://toj.tfcis.org/oj/pro/274/
定義單錯誤迴文為一個字串中只除去一個字元後,剩下的字串為迴文
給一個字串,求該字串是否為單錯誤迴文

想法

對於一個字串 $s$ ,檢查其左右兩端 $L$ $R$
如果 $s[L] == s[R]$ 那麼就繼續檢查 $L+1$ 到 $R-1$
否則判斷 $L+1$ 到 $R$ 這個字串以及 $L$ 到 $R-1$ 這個字串誰是迴文
如果在這其中錯誤超過 $1$ 次,那就表示這不是單錯誤迴文

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//By Koios1143
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
int n;
string s;
bool check(int l,int r,int err){
for(;l<r;l++,r--){
if(s[l]==s[r])
continue;
else{
if(err==1) return false;
return check(l+1,r,err+1) || check(l,r-1,err+1);
}
}
}
int main(){
cin>>n;
while(n--){
cin>>s;
cout<<(check(0,s.size()-1,0) == true ? "YES\n" : "NO\n");
}

return 0;
}

複雜度分析

對於一個字串至多檢查全部
複雜度 $O(nlen(s))$