codeforce Kalindrome Array题解

  • Post author:
  • Post category:其他




codeforce Kalindrome Array题解**


题意

:给定一个数组,可以对这个数组进行以下操作:选定一个值,并且删除值x(可以删除零个x,一个x,两个x,三个x……)。进行操作之后,判断这个数组是不是回文串序列。是的话输出YES,反之输出NO。

思路 :


1 : 首先判断这个数组首字母和尾字母是否相等,如果相等,再继续向前判断


2: 如果这两个值不相等,就把这两个值的其中一个删掉,在进行判断


代码如下

// 首先判断首与尾是否相等,相等则继续向下判断 。 如果不相等,就把这个值删掉 再继续判断是不是相等
#include<bits/stdc++.h>
using namespace std ;
#define int long long
const int N = 1e6 + 99 ;
int a[N] , n , t , flag;
int check(int x){
	for(int i = 0 , j = n - 1 ; i < j ; i ++ , j -- ){
		while(a[i] == x) i ++ ;
		while(a[j] == x) j -- ;
		if(a[i] == a[j]) continue ;
		return 0 ; 
	}
	return 1 ;
}
void solve(){
	for(int i = 0 , j = n - 1 ; i < j ; i ++ , j -- ){
		if(a[i] == a[j]){
			continue ;
		}else{
			if(check(a[i]) == 1){
				flag = 1 ;               // 如果删掉a【i】 值 ,这个序列满足回文串。 
				return ;
			}
			if(check(a[j]) == 1){
				flag = 1 ;               // 同上 。 
				return ;
			}
			flag = 0 ;                   // 如果删掉两个值都不满足就直接退出,。 
			return ;
		}
	}
}
void print(){
	if(flag){
		cout << "YES" << endl ;
	}else{
		cout << "NO" << endl ;
	}
}
signed main(){
    cin >> t ;
	while(t --){
		cin >> n ; 
	    flag = 1 ;   // 0 代表 no , 1 代表 yes 
		for(int i = 0 ; i < n ; i++ ){
			cin >> a[i] ;
		}
		solve() ;
		print() ;
	}	
	return 0 ;
} ```



版权声明:本文为qq_51797890原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。