文章目录
方法
-
将字符串转换为字符数组
-
一般可以采用双指针对数组进行遍历
- 若是对整个字符串进行翻转,则需要定义整个字符串的首尾指针
- 若是对字符串中的一个个单词,则指针需要对字符穿中的一个个单词进行,(关键是如何判别单词,根据空格对字符串中的一个个单词进行区分)
-
最后将处理完的数组转换为字符串
LeetCode344翻转字符串
首尾指针,双向推进对字符串进行中的元素进行交换
public void reverseString(char[] s) {
int left = 0;
int right = s.length-1;
while (left<right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
LeetCode541 翻转字符串II(2k为一组)
- 采用双指针的方式,对字符串转换为数组之后,再对其进行
2k个位一组进行翻转
package com.zj.IString;
/**
* @Author zhoujian
* @Date 2020/8/24 22:57
* 给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
* (1)如果剩余字符少于 k 个,则将剩余字符全部反转。
* (2)如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
*/
public class Problem541 {
/**
* 翻转
* @param s
* @param k
* @return
*/
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
int n = chars.length;
// 每2k个元素为一组进行翻转
for(int i=0;i<n;i+=2*k){
int left = i;
//判断下标是否越界
int right = i+k-1<n?i+k-1:n-1;
// 双指针交换
while (left<right){
char temp = chars[left];
chars[left++] = chars[right];
chars[right--] = temp;
}
}
return String.valueOf(chars);
}
}
LeetCode557 翻转字符串中的单词
- 采用双指针的方式,对字符串的媒体哥单词进行收尾交换进行收尾的交换
- 采用递归的方式解决
package com.zj.IString;
/**
* @Author zhoujian
* @Date 2020/8/25 9:28
*/
public class Problem557 {
/**
* 翻转字符串里的单词
* 采用双指针的方法
* @param s
* @return
*/
public String reverseWords1(String s) {
int left = 0;
int right = 0;
char[] t = s.toCharArray();
while (right<s.length()){
// 找到第一个空格
while (right<t.length&&t[right]!=' '){right++;}
// 交换left和right-1之间的元素
int end = right+1;
right--;
if(right<t.length) {
while (left < right){
char temp = t[left];
t[left]=t[right];
t[right]=temp;
left++;
right--;
}
}
left=right=end;
}
return new String(t);
}
// 采用递归的方法
public String reverseWords(String s) {
char[] arr = s.toCharArray();
dfs(arr,0);
return new String(arr);
}
public void dfs(char[] arr,int start){
if(start>=arr.length) return;
// 找到第一个空格
int end = start;
while (end<arr.length&&arr[end]!=' '){
end++;
}
dfs(arr,end+1);
// 将start于end-1之间的元素进行交换
int right = end-1;
while (start<right){
char temp = arr[start];
arr[start]=arr[right];
arr[right]=temp;
start++;
right--;
}
}
public static void main(String[] args) {
String s = "Let's take LeetCode contest";
Problem557 problem557 = new Problem557();
String reverseWords = problem557.reverseWords(s);
System.out.println(reverseWords);
}
}
LeetCode151 翻转字符串里的单词(单词不需要翻转)
- 采用双指针的方式对数组一句空格对数组进行遍历,以此来区分单词
package com.zj.IString;
/**
* @Author zhoujian
* @Date 2020/8/24 19:42
*/
public class Problem151 {
/**
* 翻转字符串里的单词
* @param s
* @return
* 双指针
*/
public String reverseWords(String s) {
// 倒序遍历字符串s,记录单词左右索引边界i,j
// 每确定一个单词的边界,则将其加入值单词列表res中
// 最终将单词列表拼接位字符串并返回即可
s = s.trim();
int j = s.length()-1,i=j;
StringBuilder res = new StringBuilder();
while (i>=0){
while(i>=0&&s.charAt(i)!=' ') i--;//搜索收个空格
res.append(s.substring(i+1,j+1)+" ");//添加单词
while(i>=0&&s.charAt(i)==' ') i--;//跳过单词间劲歌
j = i;//j指向下个单词的为字符
}
return res.toString().trim();
}
}
LeetCode345 翻转字符串中的元音字母
采用收尾指针,对字符串进行遍历,找到元音字母就进行交换
package com.zj.IString;
/**
* @Author zhoujian
* @Date 2020/8/24 20:28
*/
public class Problem345 {
/**
*
* @param s
* @return
*/
public String reverseVowels(String s) {
char[] source = s.toCharArray();
int left =0 ;
int right = s.length()-1;
String t = "aeiouAEIOU";
while (left<right){
// 找到s
while (left<right&&!t.contains(source[left]+"")) left++;
while (left<right&&!t.contains(source[right]+"")) right--;
if(left<right){
char temp = source[left];
source[left]=source[right];
source[right]=temp;
}
left++;
right--;
}
return new String(source);
}
public static void main(String[] args) {
String s = "leetcode";
Problem345 problem345 = new Problem345();
String reverseVowels = problem345.reverseVowels(s);
System.out.println(reverseVowels);
}
}