題敘
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
   |  #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))$