最长公共前缀
- 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
- 思路:先利用Arrays.sort(strs)为数组排序,再将数组第一个元素和最后一个元素的字符从前往后对比即可!
@Test
public void comHeadTest() {
String[] strs = new String[]{"qwe", "qwerrr", "q"};
boolean flag = checkStr(strs);
if (!flag) {
System.out.println("");
return;
}
Arrays.sort(strs);
StringBuffer sb = new StringBuffer();
int num = Math.min(strs[0].length(), strs[strs.length - 1].length());
for (int i = 0; i < num; i++) {
if (strs[0].charAt(i) != strs[strs.length - 1].charAt(i)) {
break;
} else {
sb.append(strs[0].charAt(i));
}
}
System.out.println(sb.toString());
}
private boolean checkStr(String[] strs) {
boolean flag = true;
for (int i = 0; i < strs.length; i++) {
if (strs[i] == null || strs[i].length() == 0) {
flag = false;
break;
}
}
return flag;
}
最长回文串
- 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如
"Aa"
不能当做一个回文字符串。注
意:假设字符串的长度不会超过 1010。
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
- 思路:统计字符出现次数为双数的组合+一个只出现一次的字符,遍历str,每次将char存入set集合中时先判断是否存在,如果存在,删除存在的char并count++,最后判断set是否为空,非空+1
class Solution {
public int longestPalindrome(String s) {
if (s.length() == 0)
return 0;
// 用于存放字符
HashSet<Character> hashset = new HashSet<Character>();
char[] chars = s.toCharArray();
int count = 0;
for (int i = 0; i < chars.length; i++) {
if (!hashset.contains(chars[i])) {// 如果hashset没有该字符就保存进去
hashset.add(chars[i]);
} else {// 如果有,就让count++(说明找到了一个成对的字符),然后把该字符移除
hashset.remove(chars[i]);
count++;
}
}
return hashset.isEmpty() ? count * 2 : count * 2 + 1;
}
}
验证回文串
- 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。
输入: "A man, a plan, a canal: Panama"
输出: true
输入: "race a car"
输出: false
- 思路:前后双向遍历,跳过非字母和数字的char,判断前后的char是否一致。
@Test
public void reversion() {
String str = "A man, a plan, a canal: Panama";
boolean flag = true;
if (str.length() == 0 || str == null) {
System.out.println(flag);
return;
}
int left = 0;
int right = str.length() - 1;
while (left < right) {
if (!Character.isLetterOrDigit(str.charAt(left))) {
left++;
} else if (!Character.isLetterOrDigit(str.charAt(right))) {
right--;
} else {
if (String.valueOf(str.charAt(left)).equalsIgnoreCase(String.valueOf(str.charAt(right)))) {
left++;
right--;
} else {
flag = false;
break;
}
}
}
System.out.println(flag);
}
}
把字符串转换成整数
-
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
-
思路:用Character.isDigit()方法判断是否为数字,用char-‘0’将char转成int参与运算;别忘记进行符号验证。
@Test
public void parseStrToIntTest() {
String str = "+1542342";
int i = parseStrToInt(str);
System.out.println(i);
}
private int parseStrToInt(String str) {
if (str == null) {
throw new RuntimeException("不能为null");
}
int flag = 0;
if (str.charAt(0) == '-') {
flag = 1;
}
if (str.charAt(0) == '+') {
flag = 2;
}
int start = flag > 0 ? 1 : 0;
int length = str.length();
int k = 1;
int result = 0;
for (int i = length - 1; i >= start; i--) {
if (!Character.isDigit(str.charAt(i))) {
return 0;
} else {
result = (str.charAt(i) - '0') * k + result;
k = k * 10;
}
}
return flag == 1 ? -result : result;
}
}