字符串移位包含的问题(★)

问题描述

给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含。

样例输入

AABCD CDAA
ABCD ACBD

样例输出

true
false

代码

#include <stdio.h>
#include <string.h>

bool search(char* src, char* des, int startIndex);

int main(int argc, char** argv) {
    char src[100];
    char des[100];
    
    while(scanf("%s %s",src,des) != EOF)
    {
        int len = strlen(src);
        
        int index = 0;
        for(; index < len; ++index)
        {
            if (src[index] == des[0])
            {
                bool success = search(src, des, index);    
                if (success){
                    printf("true
"); 
                    break;
                }
            }
        }
        
        if (index == len)
        {
            printf("false
");
        }
        
    }
    
    return 0;
}

bool search(char* src, char* des, int startIndex)
{
    int srcLen = strlen(src);
    int desLen = strlen(des);
    
    int index = 0;
    for(; index < desLen; ++index)
    {
        if (src[startIndex] == des[index])
        {
            ++startIndex;
            startIndex %= srcLen;
        } else {
            break;
        }
    }
    
    return index == desLen;
     
}

思路及代码说明

  1. startIndex %= srcLen;
    涉及到循环移动的地方,总能想起操作系统中“生产者——消费者”的模式。这种通过取余回到队列前端的方法,在逻辑上就像是将队列首尾相接。

  2. if (src[index] == des[0])
    用于加速。因为对 search 函数的封装,导致每次进入都要调用两次 strlen() 。减少对 search() 的调用应该能省那么一点点时间吧。

  3. 与那种复制一份 source 接到原来的 source 后面,并调用 strstr() 函数来判断是否包含的方法比起来,比较省空间。
    与那种真正将 src 数组循环移位的方法比起来,比较省时间。

原文地址:https://www.cnblogs.com/schaepher/p/6561736.html