时间紧,任务重,直接看题;
题目:反转字符串中的单词
151. 反转字符串中的单词 - 力扣(LeetCode)
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s =the sky is blue
输出:blue is sky the
题目分析:
将字符串去掉首尾空格之后,颠倒单词的顺序。方法一,字符串分割为数组,数组反转。第二种,直接调用对应的库函数
public class Solution {public string ReverseWords(string s) {return string.Join(' ',s.Split(' ').Where(str=>str!="").Reverse());}
}
对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。
代码随想录 (programmercarl.com)
题目:右旋字符串
55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
输入描述
输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出描述
输出共一行,为进行了右旋转操作后的字符串。
输入示例
2
abcdefg
输出示例
fgabcde
题目分析:
这里加个难度,要求不使用额外空间。这里的n实际上将字符串分成了两个部分,比如abcdefg,分为了abcde和fg,那么我们对这两个部分分别反转后变成了,edcba和gf,在对字符串整体反转就成了fgabcde。其实这里不论是先反转整体还是先局部,都是可以的。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){string str;int n;cin>>n;cin>>str;int len = str.size(); //获取长度reverse(str.begin(),str.begin()+(len-n));reverse(str.begin()+(len-n),str.end());reverse(str.begin(),str.end());cout<<str<<endl;
}
对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。
代码随想录 (programmercarl.com)
题目:实现Str()(找出字符串中第一个匹配项的下标)
28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle
不是 haystack
的一部分,则返回 -1
。
题目分析:
这一题实际上就是实现一个Str函数
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2
示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1
这种字符串匹配的题是KMP的解法。
而KMP的思想就是当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。而如何去记录这个已经匹配过的内容就是KMP的重点,这些事前缀表(next数组)所需要负责的事情。
至于前缀与后缀是什么?再之前的题中就已经有过提及,这里就步赘述了。而这个前缀表其实就是记录了下标i包括i,之前有多大长度的相同前缀后缀。
那么如何求这个next数组的值呢?来看看最长公共前后缀。举个列子:aabaaf,需要注意的是这里用的是字串
a 0
aa 1 前:a, 后:a 最长相等前后缀: a 长度 1
aab 0 前:a,aa 后:b,ab
aaba 1 前:a,aa,aab 后缀:a,ba,aba 最长相等前后缀: a 长度 1
aabaa 2 前:a,aa,aab,aaba 后缀:a,aa,baa,abaa 最长相等前后缀: aa 长度 2
aabaaf 0
所以 0,1,0,1,2 ,0为 aabaaf的前缀表(next数组)。
实际上这个next数组与字符串对应位置的值就是表示:在下标i包括i,的字符串子串中,有多大长度的相同前缀后缀。什么意思呢?在我看来就是说在这个位置的字符串,他的有一部分是前后相同的,假如后边相同部分的匹配处了问题,就可以聪前面相同部分的后面开始继续匹配,不需要从头开始了。
来看一张图:
https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B22.gif
这就是整个匹配的过程。
来看看代码中如何构建这个next数组:
public class Solution {public int StrStr(string haystack, string needle) {if(needle.Length==0) return 0;int[] next=new int[needle.Length];GetNext(needle,next);int j=0;for(int i=0;i<haystack.Length;i++){while(j>0&&haystack[i]!=needle[j]){j=next[j-1];//回退}if(haystack[i]==needle[j]){j++;//匹配下个字符}if(j==needle.Length)//完成{return i-needle.Length+1;}}return -1;}//构建next数组public void GetNext(string str,int[] next){int j=0;next[0]=0;for(int i=1;i<str.Length;i++){while(j>0&&str[i]!=str[j]){j=next[j-1];//回退}if(str[i]==str[j]){j++;}next[i]=j;}}
}
对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。
代码随想录 (programmercarl.com)
题目:重复的字符字串
459. 重复的子字符串 - 力扣(LeetCode)
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。
题目分析:
先来看看暴力解法吧。
public class Solution {public bool RepeatedSubstringPattern(string s) {int n=s.Length;if(n==1) return false;for(int i=1;i<n;i++){if(s[i]==s[0]){//因为字串一定是是s[0]开始的int index=i-0;//当前位置bool flg=true;for(int j=1;j+index<n;j++){if(s[j]!=s[j+index]){//不匹配了flg=false;break;}}if(flg ==true && n%index==0){//匹配成功,并且刚好匹配完return true;}}}return false;}
}
Kmp解法:
public class Solution {
public bool RepeatedSubstringPattern(string s)
{if (s.Length == 0)return false;int[] next = GetNext(s);int len = s.Length;if (next[len - 1] != 0 && len % (len - next[len - 1]) == 0) return true;return false;
}
public int[] GetNext(string s)
{int[] next = Enumerable.Repeat(0, s.Length).ToArray();for (int i = 1, j = 0; i < s.Length; i++){while (j > 0 && s[i] != s[j])j = next[j - 1];if (s[i] == s[j])j++;next[i] = j;}return next;
}
}
对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。
代码随想录 (programmercarl.com)
累计题目:23