zoukankan      html  css  js  c++  java
  • leetcode-796-Rotate String

    题目描述:

    We are given two strings, A and B.

    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。

  • 相关阅读:
    Web安全学习笔记之更新kali国内源
    K8S学习笔记之二进制的方式创建一个Kubernetes集群
    K8S学习笔记之Kubernetes核心概念
    K8S学习笔记之修改K8S的api-server证书
    Docker学习笔记之Copy on Write机制
    ELK学习笔记之简单适用的ES集群监控工具cerebro安装使用
    ELK学习笔记之F5利用EELK进行应用数据挖掘系列(2)-DNS
    ELK学习笔记之F5利用ELK进行应用数据挖掘系列(1)-HTTP
    ELK学习笔记之F5-HTTP-requesting-logging logstash filter
    Debian 无线网卡驱动问题
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9048971.html
Copyright © 2011-2022 走看看