反转字符串里的单词
-
可以使用语言提供的方法解决:
-
将字符串按空格分开,转换为数组/集合
-
使用 reserve 方法,反转数组/集合元素
-
再将数组/集合转换为字符串
-
-
具体代码如下:(2023/09/30早)
public static String reverseWords2(String s) {
if (s == null || s.length() == 0) {
return s;
}
// 取出首尾空白字符串
s = s.trim();
// 分割单词
String[] split = s.split("\\s+");
List<String> wordList = Arrays.asList(split);
// 反转
Collections.reverse(wordList);
// 转换为字符串
return String.join(" ", wordList);
}
验证回文串
-
什么是回文字符串?示例如下:
A man, a plan, a canal: Panama 将该字符串反转后: amanaplanacanalpanama,这就是回文字符串
-
我们仍然使用双指针法解决:
-
首先要做的就是遍历一遍字符串,把所有的字母都放到新的字符串中
-
再使用双指针相向遍历新字符串,遍历的的过程中,判断两指针指向元素是否相同
-
直到两指针相遇,说明是回文字符串
-
-
具体代码如下:
public static boolean isPalindrome(String s) {
StringBuffer sgood = new StringBuffer();
int length = s.length();
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
if (Character.isLetterOrDigit(ch)) {
sgood.append(Character.toLowerCase(ch));
}
}
StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
return sgood.toString().equals(sgood_rev.toString());
}
字符串里的第一个唯一字符
-
最好用的方法:Hash法
-
定义一个 Map 集合,我们遍历一遍字符串,使用 Map 记录每个字符出现过的次数
-
再次遍历该 Map,取到第一个出现次数大于1的元素
-
-
具体代码如下:(2023/09/30早)
public static int firstUniqChar(String s) {
if (s == null || s.length() == 0) {
return 0;
}
Map<Character, Integer> frequency = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
frequency.put(ch, frequency.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < s.length(); ++i) {
if (frequency.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
判断是否互为字符重排
-
什么是字符重排?就是将其中一个字符串中的字符顺序打乱重新排列后,能否成为另一个字符串
-
这个就更好办了,我们有两种思路:
-
排序法
-
Map法
-
-
排序法:
-
分别快速地对两个字符串中的字符进行排序
-
然后直接比较两字符串是否相等即可
-
-
具体代码如下:
public static boolean checkPermutation(String s1, String s2) {
// 将字符串转换成字符数组
char[] s1Chars = s1.toCharArray();
char[] s2Chars = s2.toCharArray();
// 对字符数组进行排序
Arrays.sort(s1Chars);
Arrays.sort(s2Chars);
// 再将字符数组转换成字符串,比较是否相等
return new String(s1Chars).equals(new String(s2Chars));
}
-
Map法:
-
分别统计两个字符串中,各个字符出现的次数
-
再次比较字符出现次数,只有每个字符出现的次数都一样,才能算两字符串互为字符重排
-
-
具体代码如下:(2023/09/30早)
public static boolean checkPermutation2(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
char[] s1chars = s1.toCharArray();
HashMap<Character, Integer> s1Map = getMap(s1);
HashMap<Character, Integer> s2Map = getMap(s2);
for (char s1char : s1chars) {
if (!s2Map.containsKey(s1char) || (int) s1Map.get(s1char) != (int) s2Map.get(s1char)) {
return false;
}
}
return true;
}
private static HashMap<Character, Integer> getMap(String str) {
HashMap<Character, Integer> map = new HashMap<>();
char[] chars = str.toCharArray();
for (char aChar : chars) {
map.put(aChar, map.getOrDefault(aChar, 0) + 1);
}
return map;
}