在刷CC150,总结一下常用方法和解题思路。
希望早日刷完,开始LeetCode持续更新中
常用方法
- charAt(下标):返回下标所在的字符
- toCharArray():字符串转数组
- copyValueOf(数组名):数组转字符串
- s1.contains(s2):检查s2是不是s1的子串,返回布尔值
StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。
StringBuffer允许多线程进行字符操作。这是因为在源代码中StringBuffer的很多方法都被关键字**synchronized **修饰了,而StringBuilder没有。
解题思路
- String,想到char,要立刻联想到ASCII码,也就是int,可转为处理数字
- 如果是ASCII码,那最多有256种不同的字符
- 思路要灵活,微观难以实现,就从抽象的角度看,比如这个题:
假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。
测试样例:
"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true
观察可以发现,旋转先将原字符串分割成AB两段,再转成BA的形式。那么将原串拼起来,ABAB,就一定包含BA的子串。
代码:
public class ReverseEqual {
public static boolean checkReverseEqual(String s1, String s2) {
if(s1.length() != s2.length())
return false;
String s = new String(s1+ s1);
return(s.contains(s2));
}
}
如果想不起contains函数,自己实现也是很简单的:
public class ReverseEqual {
public static boolean checkReverseEqual(String s1, String s2) {
if(s1.length() != s2.length())
return false;
StringBuilder s = new StringBuilder(s1+ s1);
for(int i = 0; i < s1.length();i++) {
StringBuilder b = new StringBuilder();
for(int j = i; j < i + s1.length(); j++) {
b = b.append(s.charAt(j));
if(b.toString().equals(s2))
return true;
}
}
return false;
}
}
To be continued~