LINTCODE——重复字符串
思路:题目要就计算A的重复次数,则由A和B的长度不难得出重复次数cnt的最大值应该是等于(B.size()%A.size() <= 1 ? 1 :2) + B.size()/A.size();
即,如果B的长度除以A的长度取整(记为x),此时如果恰好整除或者余1,则A所能匹配到的最长值所能重复的最大次数应该是x+1,若余数超过1,则为x+2,若是不理解,也可以自己画个图应该就知道;
剩下一个要说的就是字符串匹配的算法了,我这里用的是暴力无脑法,因为这两天的进度也快学习到字符串处理了,先这样写的,等学了再回来修改查找方法;
方法一:用暴力法查找;
class Solution {
public:
/*
* @param : string A to be repeated
* @param : string B
* @return: the minimum number of times A has to be repeated
*/
int repeatedString(string &A, string &B) {
// write your code here
if(A.empty())
return -1;
//cnt为最大复制次数
int cnt = (B.size()%A.size() <= 1 ? 1 :2) + B.size()/A.size();
string str = A;
int ret = 1;
//如果在规定次数之内找到则返回,否则返回-1
while(cnt-- >= 0)
{
if(str.size()>=B.size())
{
for(int i = 0; i <= (str.size() - B.size()); i++)
{
int j = 0;
for(int ii = i; j < B.size(); j++,ii++)
{
if(str[ii]!=B[j])
break;
}
if(j == B.size())
return ret;
}
}
str += A;
ret++;
}
return -1;
}
};
方法二:基于Boyer-Moore字符串查找;
class Solution {
public:
/*
* @param : string A to be repeated
* @param : string B
* @return: the minimum number of times A has to be repeated
*/
int repeatedString(string &A, string &B) {
// write your code here
if(A.empty())
return -1;
//cnt为最大复制次数
int cnt = (B.size()%A.size() <= 1 ? 1 :2) + B.size()/A.size();
string str = A;
int ret = 1;
vector<int> right(256,-1);
for(int i = 0; i < B.size(); i++)
right[B[i]] = i;
//如果在规定次数之内找到则返回,否则返回-1
while(cnt-- >= 0)
{
if(str.size()>=B.size())
{
for(int i = 0, skip = 0; i <= (str.size() - B.size()); i++)
{
skip = 0;
for(int j = 0; j < B.size(); j++)
{
if(B[j] != str[i+j])
{
skip = j - right[str[i+j]];
if(skip < 1)
skip = 1;
break;
}
}
if(skip == 0)
return ret;
}
}
str += A;
ret++;
}
return -1;
}
};