1. 程式人生 > >686.重複疊加字串匹配

686.重複疊加字串匹配

686.重複疊加字串匹配

解決思路:
分幾種情況去討論;
值得注意的是時刻更新確定頭部多出的字串長度;

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; } };