每日一练:最长对称字串(注意最后两种方法)

巧妙的解法

需要考虑回文字符串是奇数还是偶数

参考其他人的代码,

i从0开始计数,j从1开始计数


如果回文字符串为奇数

判断i-j和i+j所在位置的字符是否相等,

同时注意循环的必要条件

i>=j;

i+j<length;

for(int i=0;i<len;i++){
		temp=1;
		for(int j=1;j<len;j++){
			if(i-j<0||i+j>=len||s[i-j]!=s[i+j]){
				break;
			}temp += 2;
		}
		max = temp > max? temp : max;
	}


 

如果回文字符串为偶数

判断i-j+1和i+j所在位置的字符是否相等

同时循环的必要条件

i+1>=j;

i+j<length;

for(int i=0;i<len;i++){
		temp=0;
		for(int j=1;j<len;j++){
			if(i-j+1<0||i+j>=len||s[i-j+1]!=s[i+j]){
				break;
			}temp += 2;
		}
		max = temp > max? temp : max;
	}

总代码如下

#include<iostream>
using namespace std;
int main(){
	string s;
	getline(cin , s);
	int max=0,temp;
	int len=s.length();
	for(int i=0;i<len;i++){
		temp=1;
		for(int j=1;j<len;j++){
			if(i-j<0||i+j>=len||s[i-j]!=s[i+j]){
				break;
			}temp += 2;
		}
		max = temp > max? temp : max;
	}
	for(int i=0;i<len;i++){
		temp=0;
		for(int j=1;j<len;j++){
			if(i-j+1<0||i+j>=len||s[i-j+1]!=s[i+j]){
				break;
			}temp += 2;
		}
		max = temp > max? temp : max;
	}
	
	
	cout<<max;
	
	return 0;
} 

 参考文章:

L2-008. 最长对称子串-PAT团体程序设计天梯赛GPLT – 柳婼 の blog

7-9 最长对称子串_韩旭051的博客-CSDN博客_最长对称子串

暴力求解

#include <iostream>
using namespace std;
#include<string>
#include<cstring>

int main()
{
    string s;
    getline(cin,s);
    int length=0;
//    if(s.size()%2==0)
//        length=0;
//    else
//        length=1;
    for(int i=0;i<s.size();i++)
    {
        //int temp=0;
        for(int j=s.size()-1;j>=i;j--)
        {
            int l=i,r=j;
            while(l<=r&&s[l++]==s[r--])

            if(l>r)
                length=max(length,j-i+1);

        }
//        if(temp>length)
//            length=temp;
    }
    cout<<length<<endl;
    return 0;
}

用#方法

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	getline(cin,s);
	string cnt="#";
	int len=s.size();
	for(int i=0;i<len;i++)	cnt+=s[i],cnt+='#';
	len=cnt.size();
	int ans=1;
	for(int i=0;i<len;i++)
	{
		int tmp=0;
		if(cnt[i]!='#')	tmp++;
		for(int j=i-1,l=i+1;j>=0&&l<len;j--,l++)
			if(cnt[j]==cnt[l])
			{	if(cnt[j]!='#')	tmp+=2;}
			else	break;
		ans=max(ans,tmp);
	}
	cout<<ans;
}	

不太懂的一种

三层循环,

i从尾部开始

j从头部开始

前两个循环的判断条件为i+j<len

t=j,k=i

#include<stdio.h>
#include<string.h>
char str[1010];
int main(){
    int i,j,t,k;
    int flag = 0;
    gets(str);
    int l = strlen(str);
    for(i=l-1;i>=2;i--){
        for(j=0;i+j<l;j++){ //第一趟,最大的范围,一次,第二趟 (0到l-2, 1到l-1,两次),第三趟 (0到l-3,1到l-2,2到l-1,一共三趟).......
            for(t=j,k=i+j;k>=t;t++,k--){
                if(str[t]!=str[k])
                    break;
            }
            if(t>k){   //只要满足这个条件代表已经找到最大的回文串了
                flag = 1;
                break;
            }
        }
        if(flag == 1){//说明前面break,已经找到最大对称的了,此时i即为长度-1,因为是从0到i的所以长度应该是i+1;
            break;
        }
    }
    if(i>=2){
        printf("%d",i+1);
    }else{
        printf("1");
    }
}


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值