1 条题解

  • 0
    @ 2026-5-19 0:29:06

    就没有人想到这个简单的三FOR方法吗?

    那我就来分享一下:

    通过理解题目,我们可以发现,k这是越小越好的。

    • 所以我们可以直接判断字符串内任意连续k位的所有子串有没有重复。

    • 有就继续枚举下一个k没有,那就输出当前枚举的k即可。

    • k的最大范围就是字符串长度(就只有一种情况,别告诉我还不能确定)

    方法简单,思路明了,程序就更不在话下了。

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    using namespace std;
    string s;int len;
    bool ck(int x)
    {
      for(int i=0;i<len-x+1;i++)
      {
        string ss=s.substr(i,x);//记录当前枚举的连续k位的数字。
        int num=0;
        for(int j=0;j<len-x+1;j++)//枚举找重复。
          if(s.substr(j,x)==ss)num++;//记录重复次数
        if(num>1)return false;//如果有重复那就证明不符合。(除去它本身一个)
      }
      return true;//所有的都不重复,返回true。
    }
    int main()
    {
      cin>>len>>s;
      for(int i=1;i<=len;i++)//枚举最小k
        if(ck(i)){cout<<i;return 0;}//判断符不符合条件。
      return 0;
    }
    
    • 1

    信息

    ID
    6928
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    88
    已通过
    21
    上传者