题解 | #字符串是否由子串拼接#

字符串是否由子串拼接

https://www.nowcoder.com/practice/3c06901112f6465d859909f2601fccbd

解题思路

  1. 这是一个字符串首尾拼接问题,需要判断一个字符串是否由某个子串重复拼接而成
  2. 解题步骤:
    • 将原字符串拼接自身得到双倍长度的字符串
    • 去掉拼接后字符串的首尾字符
    • 在处理后的字符串中查找原字符串
    • 如果找到且位置在前半部分,则说明存在满足条件的子串

代码

#include <iostream>
#include <string>
using namespace std;

string findSubstring(string s) {
    int n = s.length();
    
    // 将字符串拼接自身并去掉首尾
    string doubled = s + s;
    string trimmed = doubled.substr(1, 2 * n - 2);
    
    // 在处理后的字符串中查找原字符串
    size_t pos = trimmed.find(s);
    if(pos != string::npos && pos < n) {
        return s.substr(0, pos + 1);
    }
    return "false";
}

int main() {
    string s;
    cin >> s;
    cout << findSubstring(s) << endl;
    return 0;
}
import java.util.Scanner;

public class Main {
    public static String findSubstring(String s) {
        int n = s.length();
        
        // 将字符串拼接自身并去掉首尾
        String doubled = s + s;
        String trimmed = doubled.substring(1, 2 * n - 1);
        
        // 在处理后的字符串中查找原字符串
        int pos = trimmed.indexOf(s);
        if(pos != -1 && pos < n) {
            return s.substring(0, pos + 1);
        }
        return "false";
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(findSubstring(s));
    }
}
def find_substring(s):
    n = len(s)
    
    # 将字符串拼接自身并去掉首尾
    doubled = s + s
    trimmed = doubled[1:2*n-1]
    
    # 在处理后的字符串中查找原字符串
    pos = trimmed.find(s)
    if pos != -1 and pos < n:
        return s[:pos+1]
    return "false"

s = input()
print(find_substring(s))

算法及复杂度

  • 算法:字符串匹配
  • 时间复杂度: - 为字符串长度
  • 空间复杂度: - 需要存储拼接后的字符串
全部评论

相关推荐

08-29 19:44
门头沟学院 Java
wish233:很强了,加上这个学历,一点小建议就是可以把你的项目做一个压测,比如说你的RPC,可以对比一下和http相比性能怎么样。还有你的秒杀,一定要自己压测一遍,确保不会出现数据不一致的问题。还有就是对于分布式锁的粒度一定要理清楚,这个很容易被问到。
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
搜索部&nbsp;首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务