系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、 [344. 反转字符串](https://leetcode.cn/problems/reverse-string/)
- 二、 [541. 反转字符串 II](https://leetcode.cn/problems/reverse-string-ii/)
- 三、 [剑指Offer 05.替换空格](https://blog.csdn.net/qq_41810415/article/details/124566132)
- 27.移除元素
- [151. 反转字符串中的单词](https://leetcode.cn/problems/reverse-words-in-a-string/)
- 剑指Offer58-II.左旋转字符串
- [28. 实现 strStr()](https://blog.csdn.net/qq_41810415/article/details/126787837)
- 459.重复的子字符串
前言
对于字符串中的总结 一些字符串的操作 重点是KMP算法
一、 344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
class Solution {
public void reverseString(char[] s) {
for(int i =0 , j = s.length -1 ; i < j ; i++ ,j--){
char t = s[i] ;
s[i] = s[j] ;
s[j] = t ;
}
}
}
二、 541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
class Solution {
public String reverseStr(String s, int k) {
char[] a = s.toCharArray();
for(int i = 0 ; i < s.length() ; i +=(2*k)){
//由于后面要有交换操作 所以这边r-1
int l = i ; int r = Math.min(i+k , s.length())-1;
while(l < r){
char t = a[l] ;
a[l] = a[r] ;
a[r] = t ;
l++ ;
r-- ;
}
}
return new String(a);
}
}
三、 剑指Offer 05.替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
class Solution {
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder();
for(int i = 0 ; i < s.length() ; i++){
if(s.charAt(i) == ' '){
res.append("%20");
}else{
res.append(s.charAt(i));
}
}
return res.toString();
}
}
27.移除元素
151. 反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
输入:s = “the sky is blue”
输出:“blue is sky the”
进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。
思路:移除多余空格
将整个字符串反转
将每个单词反转
举个例子,源字符串为:"the sky is blue "
移除多余空格 : “the sky is blue”
字符串反转:“eulb si yks eht”
单词反转:“blue is sky the”
题解的话 这个很详细
java的话 就是不用翻转的做法
class Solution {
public String reverseWords(String s) {
//java中的String是不可变的 所以空间O(1)是没办法的
String res = "";
int n = s.length();
for(int i = n-1 ; i >= 0 ; i--){
if(s.charAt(i) == ' ') continue;
int j = i ;
while(j-1 >= 0 && s.charAt(j-1) != ' ') j--;
//此时j-i为blue
res += s.substring(j,i+1)+" ";
i = j ;//更新
}
return res.substring(0,res.length()-1) ;
}
}
class Solution {
public String reverseWords(String s) {
if(s.length() == 0||s == null)return "";
//去掉多余空格
String[] w = s.trim().split("\\s+");
Collections.reverse(Arrays.asList(w));
return String.join(" " , w );
}
}
剑指Offer58-II.左旋转字符串
class Solution {
public String leftRotateString(String str,int n) {
return str.substring(n) + str.substring(0,n);
}
}
class Solution {
public String leftRotateString(String str, int n) {
char[] s = str.toCharArray();
int len = s.length;
reverse(s, 0, len - 1);
reverse(s, 0, len - n - 1);
reverse(s, len - n, len - 1);
return String.valueOf(s);
}
private void reverse(char[] s, int l, int r) {
for (int i = l, j = r; i < j; i++, j--) {
char t = s[i];
s[i] = s[j];
s[j] = t;
}
}
}
28. 实现 strStr()
459.重复的子字符串
这道题要先回顾KMP中ne数组的知识 回顾点这里 点这里
证明的话 看视频
class Solution {
public boolean repeatedSubstringPattern(String s) {
int n = s.length() ;
s = " " + s ;
int[] ne = new int[n +1 ];
for(int i = 2 , j = 0 ; i <= n ; i ++){
while( j > 0 && s.charAt(i) != s.charAt(j+1)) j = ne[j];
if(s.charAt(i) == s.charAt(j+1)) j++;
ne[i] = j ;
}
int m = n - ne[n] ;
return m < n && n % m == 0 ;
}
}