字符串最短循环字串| 豆包MarsCode AI 刷题

61 阅读2分钟

问题描述

小M在研究字符串时发现了一个有趣的现象:某些字符串是由一个较短的子串反复拼接而成的。如果能够找到这个最短的子串,便可以很好地还原字符串的结构。你的任务是给定一个字符串,判断它是否是由某个子串反复拼接而成的。如果是,输出该最短的子串;否则,输出空字符串""

例如:当输入字符串为 abababab 时,它可以由子串 ab 反复拼接而成,因此输出 ab;而如果输入 ab,则该字符串不能通过子串的重复拼接得到,因此输出空字符串。


测试样例

样例1:

输入:inp = "abcabcabcabc"
输出:'abc'

样例2:

输入:inp = "aaa"
输出:'a'

样例3:

输入:inp = "abababab"
输出:'ab'

样例4:

输入:inp = "ab"
输出:''

样例5:

输入:inp = "abcdabcdabcdabcd"
输出:'abcd'

样例6:

输入:inp = "b"
输出:''

题目理解

题目要求我们判断一个给定的字符串是否可以由某个子串反复拼接而成。如果可以,我们需要找出这个最短的子串;如果不能,则返回空字符串""

题目思路

1.检查字符串

首先检查该字符串的长度,如果是空串或者只有一个字符,那就不存在循环。根据题目的要求我们应该返回一个空串。

2.寻找子串

由于题目要求寻找的是循环子串,这个字符串最短也是由字串循环两次组成的,所以只需要对长度为1len/2的子串进行查找即可。从长度为1len/2的子串进行遍历,尝试找到一个子串,并截取该字符串,得到一个模板串。

3.判断子串是否符合要求

首先判断该子串的长度是不是原字符串的长度整除,如果不能那么该子串不可能是循环子串,直接跳过。如果可以的话,则将该子串重复拼接,生成一个新的字符串。最后再比较新生成的字符串与原字符串是否相等。如果相等,则返回该子串作为结果。

4.返回结果

如果遍历完所有可能的子串长度都没有找到符合条件的子串,则返回空字符串""

代码实现

string solution(const string &inp) {
    // Edit your code here
    int len = size(inp);
    int tlen;

    if (len == 0 || len == 1)
    {
        return "";
    }
    for (int i=1;i<=len/2;i++)
    {
        string result = inp.substr(0,i);
        tlen = size(result);
        if (len % tlen == 0)
        {
            string temp = "";
            for (int j = 0; j < len / tlen; j++)
            {
                temp += result;
            }
            if (temp==inp) return result;
        }
    }
    return "";
}

知识总结

C++中substr函数的用法

语法:

字符串.substr(pos,len)const;

参数:

pos:要复制的第一个字符的位置。len:子字符串的长度。返回值: 返回一个字符串对象。