这道题我看了一下别人的题解,感觉都没我的容易理解。。哈哈哈。
先不论时间复杂度谁的更低。
我的大致思路如下:因为这道题是让求几次方,其实我们可以当成周期串来处理,输入一个字符串,找到他的最小周期,然后让字符串长度除以它的最小周期就是它的几次方了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
int flag;
if(s[0]=='.') break;
int len=s.size();
for(int i=1;i<=len;i++)
{
flag=0;
if(len%i!=0) continue;
for(int j=0;j<len;j++)
if(s[j]!=s[j%i]) {flag=1;break;}
if(!flag) {cout<<len/i<<endl;break;}
}
if(flag) cout<<"-1"<<endl;
}
}
那个循环的思路(s[j] !=s[j%i]) 特别巧妙
可以简单讲一下吗 看不懂
划分了几个周期之后,j%i是将j转化为第一个周期的本该对应的字符,然后判断下是否相同该周期的j位置与转化为第一周期的j%i位置是否相同。
这段感觉很妙,能谈谈怎么想到这个比较的吗
就想成两个指针吧, j不停的往前, (j%i)在前i个位置里循环
我也是这么想的,但我在求最小字符串这里折腾了2小时没搞出来TvT
为什么会出现-1的情况,不是一定是至少为1吗
不会出现,删掉也ac了
转了一圈,大佬你的太简洁明了了。
最后这里发现可以去掉 更加精简:if(flag) cout<<”1”<<endl;
我跟你思路一样,但我看完y总的思路之后就回不去了
if(flag) cout<<”-1”<<endl; 大佬你好,这个部分有点没看懂,不存在输出-1的情况吧?
-1相当于空,这里你输入string::npos也是一样的
确实不存在
非常棒题解,爱来自CN😍
我也爱你啊
可以int j = i,省去了比较第一个周期的
import sys,operator
for line in sys.stdin:
line=line.strip()
if line!=’.’:
# 前n个str,以n为长度去看后面依次n位是否相同
sub=’‘
for i in range(len(line)):
sub=line[:i+1]
cnt=line.count(sub)
if operator.eq(line,sub*cnt):
print(cnt)
break
为什么照抄y总视频里的代码会超时啊
相当妙啊!
厉害orz
吴世杰来喽
没看懂呀
妙啊!确实是一个非常好的想法