686.重複疊加字串匹配
阿新 • • 發佈:2018-12-29
解決思路:
分幾種情況去討論;
值得注意的是時刻更新確定頭部多出的字串長度;
class Solution {
public:
int head=0,tail=0;
int repeatedStringMatch(string A, string B)
{
int times=0;
auto pos_B=B.find(A);
if(pos_B==string::npos)
{
head=-1,tail=-1;
if(A. find(B)!=string::npos)//A完全包含B返回1
return 1;
else
{
int tmp=check(A,B);
if(tmp!=0)
return tmp;
}
//A無論如何組合都不包含B
return -1;
}
else
head=pos_B;
while (1)
{
times++;
B.erase(pos_B,A.length());
pos_B=B.find(A,head);
if(pos_B!=string::npos)
head=pos_B;//更新頭部多出字串長度
else
break;
}
if(B.length()!=0)
{
if(B.length()!=head)
{
tail=B.length()-head;
}
int tmp=check(A,B);
if(tmp==-1)
return -1;
return times+tmp;
}
return times;
}
int check(string A,string B)
{
string tmp=A+A;
if(head==-1&&tail==-1)//前置搜尋
{
if(A.find(B)!= string::npos)
return 1;
if(tmp.find(B)!=string::npos)
return 2;
return -1;
}
if(head!=0&&tail!=0)
{
if(tmp.find(B)!=string::npos)
if(B[head-1]==A[A.length()-1]&&B[head]==A[0])
return 2;
}
else if(head==0&&tail!=0)
{
if(A.find(B)!=string::npos)
if(A[0]==B[0])
return 1;
}
else if(head!=0&&tail==0)
{
if(A.find(B)!=string::npos)
if(A[A.length()-1]==B[B.length()-1])
return 1;
}
return -1;
}
};