经典笔试题—— 判断两个字符串是否为旋转词

本文介绍了一种判断两个字符串是否互为旋转词的高效算法,通过将其中一个字符串复制拼接自身并查找另一个字符串是否为拼接后字符串的子串来实现。此方法时间复杂度为O(N),适用于字符串相似性判断等场景。
  1. 判断两个字符串是否为旋转词

【题目】如果一个字符串str,把字符串str前面的部分挪到后面形成的字符串叫做str的旋转词,比如str=”12345”,str的旋转词有12345”,”23451”,”34512”,”45123”,”51234”,给定两个字符串ab,请判断ab是否互为旋转词。

【要求】解法时间复杂度0(N)


               如果a和b长度不一样,那么a和b必然不互为旋转词,可以直接返回false。当a和b长度一样,都为N时>    ,要求解法的时间复杂度为O(N)。

  分析:

  这道题考察的是一个字符串的查找的小技巧,我们就举str1 = "1234abcd", str2 = "34abcd12",  这个例子。首先string  s = str1 +

str1,      那么s中所存储的字符串

内容就是1234abcd1234abcd,接着我们需要在s这个字符查找,str2是不是s的子串就可以了,如果是,则返回true,否则返回

false。


6 #include<iostream>
  7 #include<string>
  8 using namespace std;
  9 bool rotate(string s1,string s2)
 10 {
 11     if(s1.size() == 0 || s2.size() == 0 || s1.size() != s2.size())
 12         return false;
 13     string s = s1 + s1;
 14     int res = s.find(s2);
 15 
 16     return  res != -1;//若find函数没找到相同的字符串则返回-1
 17 }
 18 int main(int argc, char *argv[])
 19 {
 20     string s1 = "abcd";
 21     bool s2 = rotate(s1, "cdba");
 22     cout<<s2<<endl;
 23     return 0;
 24 }




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值