前言
字符串也是高频考题
还是得多刷刷的
注意使用
数学函数 Math.min(a,b);
new String(arr) 来返回一个字符串,把数组进行返回;
1. 541. 反转字符串 II (Easy)每日一题,其实就是做一下反转
给定一个字符串
s
和一个整数k
,从字符串开头算起,每2k
个字符反转前k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
2.字符串反转(注意SB的使用和临界值)
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
不使用额外空间的是什么样?
3.剑指 Offer 05. 替换空格(非常简单 注意用sb就行)
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
// replace不香吗??嗯 这也太简单了
4. 字符串的全排列(M) 回溯 + 剪枝 难
class Solution {
List<String> res = new LinkedList<>();
char[] c;
public String[] permutation(String s) {
c = s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
void dfs(int x) {
if(x == c.length - 1) {
res.add(String.valueOf(c)); // 添加排列方案
return;
}
HashSet<Character> set = new HashSet<>();
for(int i = x; i < c.length; i++) {
if(set.contains(c[i])) continue; // 重复,因此剪枝
set.add(c[i]);
swap(i, x); // 交换,将 c[i] 固定在第 x 位
dfs(x + 1); // 开启固定第 x + 1 位字符
swap(i, x); // 恢复交换
}
}
void swap(int a, int b) {
char tmp = c[a];
c[a] = c[b];
c[b] = tmp;
}
}