代码随想录-字符串
1.反转字符串(力扣344)
1.1 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/06b86ed07388e600d8546a45fd4ff02c.png#pic_center)
1.2 代码
class Solution {
public void reverseString(char[] s) {
int l=0;
int r=s.length-1;
char tem='0';
while(l<=r){
tem=s[l];
s[l]=s[r];
s[r]=tem;
l++;
r--;
}
}
}
1.3 思路
1.定义两个指针,分别从左、右进行遍历并交换
2.替换空格(剑指offer05)
2.1 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8d42860dba81e7546bfad814d437e90d.png#pic_center)
2.2 代码
class Solution {
public String replaceSpace(String s) {
if(s==null || s.length()==1){
return s;
}
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
if(String.valueOf(s.charAt(i)).equals(" ")){
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
2.3 思路
遍历替换即可
3.颠倒字符串中的单词(力扣151)
3.1 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a8d850e1508e14a292a6070f7a5bd703.png#pic_center)
3.2 代码
class Solution {
public String reverseWords(String s) {
s=s.trim();
StringBuilder sb=new StringBuilder();
String[] strs=s.split(" ");
for(int i=strs.length-1;i>=0;i--){
if(strs[i].equals("")) continue;
sb.append(strs[i].replaceAll(" ",""));
if(i!=0){
sb.append(" ");
}
}
return sb.toString();
}
}
3.3 思路
要知道String中的以下方法:
1."abc".trim() 删除字符串前后的的空格
2."abc".replaceAll(" ","") 将字符串中空格替换
3."abc".split(" ") 根据空格进行字符串切割
【注意】:切割完之后,一定要判断切割后的字符串和""是否一样,一样则continue
4.替换空格(剑指offer 05)
4.1 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bcf1e80f250dfe511763d6583e49ce90.png#pic_center)
4.2 代码
class Solution {
public String replaceSpace(String s) {
if(s==null || s.length()==1){
return s;
}
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
if(String.valueOf(s.charAt(i)).equals(" ")){
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
4.3 思路
使用StringBuilder就行
5.左旋转字符串(剑指offer 58 Ⅱ)
5.1 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/52ad18a98d8816946ec152487cc428a4.png#pic_center)
5.2 代码
class Solution {
public String reverseLeftWords(String s, int n) {
if(n==s.length()){
return s;
}
StringBuilder sb=new StringBuilder();
for(int i=n%s.length();i<s.length();i++){
sb.append(s.charAt(i));
}
for(int i=0;i<n%s.length();i++){
sb.append(s.charAt(i));
}
return sb.toString();
}
}
5.3 思路
思路一:
1.先判断n是否和字符串长度相同,相同则反转之后还是自身,直接return
2.从n%s.length()开始,拼接到末尾(不包含n)
3.从0开始,拼接到n
思路二:
示例:s="abcdef" n=2
1.先将前两个字符反转:"bacdef"
2.再将后4个字符反转:"bafedc"
3.将字符串整体反转:"cdefab"
6.实现strStr()(力扣28)
6.1 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/eb517110497a94936af1b4a53cc0da62.png#pic_center)
6.2 代码
class Solution {
public int strStr(String haystack, String needle) {
if(needle==null || needle.length()==0){
return 0;
}
if(needle.length()>haystack.length()){
return -1;
}
int l1=0;
int l2=0;
while(l1<haystack.length() && l2<needle.length()){
if(haystack.charAt(l1)==needle.charAt(l2)){
l1++;
l2++;
}else{
l1=l1-l2+1;
l2=0;
}
if(l2==needle.length()){
return l1-l2;
}
}
return -1;
}
}
6.3 思路
思路一:
直接使用String的indexOf()方法
思路二:
1.判断
1.1 若needle为null或needle的长度为0,直接返回0
1.2 若needle的长度>haystack的长度,直接返回-1
2.设置双指针:l1、l2分别指向haystack和needle的左边
3.判断
3.1 l1和l2指向的字符相同的话,l1++,l2++
3.2 l1和l2指向的字符不相同的话,l1=l1-l2+1,l2=0,
【注意】:l1=l1-l2+1,是让l1指向在l2之前+1的位置
3.3 当l2指针与needle长度相同时,说明已经遍历完了
4.在while中没有return的话,就return -1
7.重复的子字符串(力扣459)
7.1 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b19a1eec16291f6ebec770af1ec79d80.png#pic_center)
7.2 代码
class Solution {
public boolean repeatedSubstringPattern(String s) {
if(s.length()==1){
return false;
}
String str=s+s;
if(str.substring(1,str.length()-1).contains(s)){
return true;
}
return false;
}
}
7.3 思路
1.将s重复拼接一次,成为str
2.破坏str中第一个字串和最后一个字串
3.若破坏后的依然存在原子串s,则返回true