蓝桥杯ADV-150-周期字串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/78896945

欢迎访问我的蓝桥杯OJ题解哦~https://blog.csdn.net/richenyunqi/article/details/84981511

题目描述

算法设计

由于字符串长度最大为100,数据量比较小,假设字符串长度为N,可以按从小到大顺序枚举1~N这N个数字看是否可以作为周期。按以下步骤判断一个数字ans是否是字符串周期:

1. 由于当一个数字ans是字符串的周期时,ans必然能整除该字符串。先判断ans能否整除字符串长度N,如果不能,则说明ans不可能是字符串周期,递增ans,再重新进行判断;若能整除,进行第2步判断

2. 定义变量 i,初始化为ans,进行N/ans重循环,每次循环结束将 i 递增ans,每次循环中判断0->ans-1这ans个字符与当前i->i+ans-1这ans个字符是否完全一致,若不一致,说明ans不是字符串周期,递增ans,跳转回第1步判断;若N/ans重循环中字符均一致,说明ans是字符串周期,输出ans,算法结束

C++代码

#include<bits/stdc++.h>​
using namespace std;
int main(){
    string s;
    cin>>s;
    int ans=1;//字符串周期
    while(1){
        while(s.size()%ans!=0)//若ans不能整除字符串长度,则递增ans
            ++ans;
        bool f=true;
        for(int i=ans;i<s.size()&&f;i+=ans)//进行N/ans重循环
            for(int j=0;j<ans&&f;++j)//判断i~ans-1字符和i~i+ans-1个字符是否完全一致
                if(s[j]!=s[i+j]){//字符不同
                    ++ans;//递增ans
                    f=false;
                }
        if(f)//N/ans重循环字符均一致,跳出循环
            break;
    }
    printf("%d",ans);
    return 0;
}

Java代码

import java.util.*;
public class Main{  
    public static void main(String[] args){  
        Scanner input=new Scanner(System.in);  
        char[] s=input.nextLine().toCharArray();
        int ans=1;//字符串周期
        while(true){
        	while(s.length%ans!=0)//若ans不能整除字符串长度,则递增ans
        		++ans;
        	boolean f=true;
        	for(int i=ans;i<s.length&&f;i+=ans)//进行N/ans重循环
        		for(int j=0;j<ans&&f;++j)//判断i~ans-1字符和i~i+ans-1个字符是否完全一致
        			if(s[j]!=s[j+i]){//字符不同
        				++ans;//递增ans
        				f=false;
        			}
        	if(f)//N/ans重循环字符均一致,跳出循环
        		break;
        				
        }
        System.out.println(ans);
    }  
}

 

展开阅读全文

没有更多推荐了,返回首页