1. 程式人生 > >leetcode-796-Rotate String

leetcode-796-Rotate String

叠代 osi ++ AS 最終 break style 隊列 dfa

題目描述:

We are given two strings, A and B.

A shift on A consists of taking string A and moving the leftmost character to the rightmost position. For example, if A = ‘abcde‘, then it will be ‘bcdea‘ after one shift on A. Return True if and only if A can become B after some number of shifts on A.

Example 1:
Input: A = ‘abcde‘, B = ‘cdeab‘
Output: true

Example 2:
Input: A = ‘abcde‘, B = ‘abced‘
Output: false

Note:

  • A and B will have length at most 100.

要完成的函數:

bool rotateString(string A, string B)

說明:

1、給定兩個字符串A和B,要求判斷這兩個字符串,可不可以通過不斷地把A中的首字母搬到末尾去,最終把A變成B。比如A為abcde,B為cdeab,就是可以通過前述操作把A變成B的。

2、明白題意,筆者最開始覺得這種結構很熟悉,應該是隊列的操作,可以定義一個隊列,把A中的字母塞到隊列中去,然後不斷地取出首位,插入到末位,判斷是不是能形成B字符串。

不過這樣子還要定義一個隊列,操作略顯麻煩,直覺這樣做並不是最簡便的方法。

之後想到其實找到B首字母,比如上面給的例子,A是abcde,B是cdeab,B中首字母是c,那麽找到c在A中的位置j,然後逐位比較A[j]和B[i](i從0開始)是否相等,這是A中後半部分的比較。

然後再比較A中前半部分是否與B中剩余部分相等。我們已知了j的位置,這些操作都是非常容易的。

這道題就可以做出來了。

不過,當碰到B中首字母在A中多次出現,而且首次出現還匹配不上,得第二次才匹配上的情況,比如A是abcdecdf,B是cdfabcde。

如果只是一次搜索,c在A中位置是第三位,這時匹配不成功。

但如果c在A中位置是倒數第三位那裏,這時候的匹配就是成功的。

所以之前的做法就得在外面再加多個循環,一直叠代,直到搜索到能匹配的位置。

代碼如下:(附詳解)

    bool rotateString(string A, string B) 
    {
        int i=0,j=0,s1=A.size(),s2=B.size();
        if(s1!=s2)//邊界條件
            return false;
        if(s1==0)//邊界條件,比如A和B都是空字符串
            return true;
        bool flag;
        while(j<s1)//j用於表示B的首字母在A中的哪個位置
        {
            while(j<s1)//一直搜索,直到找到B中首字母在A中的位置
            {
                if(B[0]==A[j])
                    break;
                j++;
            }
            flag=1;
            i=0;
            int t1=1,t2=j+1;//t1表示B中嘗試匹配的起始位置,t2表示A中嘗試匹配的起始位置
            while(t2<s1)
            {
                if(B[t1]!=A[t2])
                {
                    flag=0;
                    break;
                }
                t1++;
                t2++;
            }
            if(flag==1)//如果上述匹配能成功,那麽進行剩余部分的匹配
            {
                while(t1<s1)
                {
                    if(B[t1]!=A[i])
                    {
                        flag=0;
                        break;
                    }
                    t1++;
                    i++;
                }
            }
            if(flag==1)//如果兩個部分都匹配成功了,那麽返回true
                return true;
            j++;//如果沒有匹配成功,那麽j++,搜索B中首字母在A中的下一個出現位置
        }
        return false;//如果搜索到A的末尾,每一次都不能匹配成功,那麽返回false
    }

上述代碼實測3ms,beats 97.87% of cpp submissions。

leetcode-796-Rotate String