leetcode day26 重复的子字符串

server/2025/3/9 10:00:26/

26 重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

输入: s = "aba"
输出: false

示例 3:

输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

解法一:暴力

两层循环,i为子串长度,j起始值为第二次匹配的位置,即i

举个例子 ababab

当i=2时,s[2]=s[0],s[3]=s[1],s[4]=s[2],s[5]=s[3]

即满足s[j]=s[j-i]

bool repeatedSubstringPattern(char* s) {int n=strlen(s);bool flag=false;//遍历子串字符 i为子串长度for(int i=1;i<=n/2;i++){if(n%i==0){flag=true;for(int j=i;j<n;j++){if(s[j]!=s[j-i]){flag=false;break;}}if(flag)return true;}}return false;
}

解法二:KMP算法

next数组从0开始,next数组求解

 子串为最长相等前后缀(next[n-1])所不包含的串,n为数组长度

如果n可以整除n-next[n-1]并且next[n-1]!=0,说明是由重复子串构成的。

例如ababab

next数组为0 0 1 2 3 4,不包含的串长度为2即为子串

6%(6-4)==0,满足题意

例如aba

next数组为0 0 1 ,不包含的串长度为2即为子串。但是3%2!=0,不满足题意

如果是abab呢,next为 0 0 1 2,不包含的串长度为2即为子串。4%2!=0,满足题意

bool repeatedSubstringPattern(char* s) {int n=strlen(s);bool flag=false;int *next=(int *)malloc(sizeof(int)*(n+1));next[0]=0;for(int i=1,j=0;i<n;i++){while(j>0&&s[i]!=s[j])j=next[j-1];if(s[i]==s[j])j++;next[i]=j;}//子串为最长相等前后缀所不包含的串if(n%(n-next[n-1])==0&&next[n-1]!=0)return true;else return false;
}

右旋字符串(第八期模拟笔试)

题目描述

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例
2
abcdefg
输出示例
fgabcde
提示信息

数据范围:
1 <= k < 10000,
1 <= s.length < 10000;

k把字符串划分为两部分

1、字符串全部翻转

2、两部分分别翻转

#include<stdio.h>
#include<string.h>
void Sol(char s[],int start,int end){int tem;for(int i=start,j=end;i<=j;i++,j--){tem=s[i];s[i]=s[j];s[j]=tem;}
}
int main(){int k;scanf("%d",&k);char s[10005]={};scanf("%s",s);int len=strlen(s);Sol(s,0,len-1);Sol(s,0,k-1);Sol(s,k,len-1);for(int i=0;i<len;i++){printf("%c",s[i]);}
}

http://www.ppmy.cn/server/173084.html

相关文章

如何快速的用pdfjs建立一个网页可以在线阅读你的PDF文件

#如何快速的用pdfjs建立一个网页可以在线阅读你的PDF文件# 也许很多人都用过这个pdfjs&#xff0c;我之前也用过&#xff0c;但是每次配置也是挺麻烦的&#xff0c;于是就写了一个页面远程调用CDN文件&#xff0c;这样一个页面就可以搞定&#xff0c;话不多说直接上代码&#…

03.04、化栈为队

03.04、化栈为队 1、题目描述 实现一个 MyQueue 类&#xff0c;该类用两个栈来实现一个队列。 2、解题思路 本题要求使用两个栈来实现一个队列。队列遵循先进先出&#xff08;FIFO&#xff09;的原则&#xff0c;而栈遵循后进先出&#xff08;LIFO&#xff09;的原则。因此…

Ollama+Deepseek-R1+Continue本地集成VScode

一、OllamaDeepseek-R1Continue本地集成VScode 1&#xff09;安装前知识点 Continue 介绍 详情可参照官网&#xff1a; continue官网 Continue 是 Visual Studio Code 和 JetBrains 中领先的开源 AI 代码助手。 •在侧边栏中进行聊天以理解和迭代代码。 •自动补全&#…

深色系B端系统界面,在何种场景下更加适合?

在数字化办公日益普及的当下&#xff0c;B 端系统已成为企业运营管理不可或缺的工具。B 端系统界面设计的优劣&#xff0c;直接影响着用户体验和工作效率。界面不仅仅是人与系统交互的媒介&#xff0c;更是企业业务流程的可视化呈现。随着设计理念和技术的不断发展&#xff0c;…

算法之二维装水问题

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr&#xff0c;已知其中所有的值都是非负的&#xff0c;将这个数组看作一个容器&#xff0c;请返回容器能装多少水 比如&#xff0c;arr {3&#xff0c;1&#xff0c;2&#xff0c;5&#xff0c;2&#xff0c…

二叉树的遍历

二叉树一共有三种遍历方式&#xff0c;前序遍历(根左右)&#xff0c;中序遍历(左根右)&#xff0c;和后序遍历(左右根)。 二叉树遍历核心代码思想即为递归 对二叉树进行前序&#xff0c;中序&#xff0c;后序遍历结果如图: 为什么是这个结果呢&#xff0c;我们要对其代码进行…

使用SDKMAN!安装springboot

在 Ubuntu 环境中使用 sdk install springboot 命令之前&#xff0c;您需要先安装 SDKMAN!&#xff08;Software Development Kit Manager&#xff09;。以下是详细的安装步骤&#xff1a; 安装 SDKMAN! 打开终端。 运行以下命令以安装 SDKMAN!&#xff1a; curl -s "htt…

# Word2Vec与多义词表示:静态嵌入的优势与局限

Word2Vec与多义词表示&#xff1a;静态嵌入的优势与局限 在自然语言处理领域&#xff0c;词嵌入技术是将文本转化为机器可理解的数值向量的基础方法。Word2Vec作为经典的词嵌入模型&#xff0c;还是值得我们学习其中思想的。然而&#xff0c;它处理多义词的方式一直是讨论的焦…