在刷CC150地粪,總結(jié)一下常用方法和解題思路慷彤。
希望早日刷完蜒简,開(kāi)始LeetCode持續(xù)更新中
常用方法
- charAt(下標(biāo)):返回下標(biāo)所在的字符
- toCharArray():字符串轉(zhuǎn)數(shù)組
- copyValueOf(數(shù)組名):數(shù)組轉(zhuǎn)字符串
- s1.contains(s2):檢查s2是不是s1的子串拉宗,返回布爾值
StringBuilder的效率比StringBuffer稍高咖祭,如果不考慮線程安全,StringBuilder應(yīng)該是首選卵洗。
StringBuffer允許多線程進(jìn)行字符操作请唱。這是因?yàn)樵谠创a中StringBuffer的很多方法都被關(guān)鍵字**synchronized **修飾了弥咪,而StringBuilder沒(méi)有。
解題思路
- String十绑,想到char聚至,要立刻聯(lián)想到ASCII碼,也就是int本橙,可轉(zhuǎn)為處理數(shù)字
- 如果是ASCII碼扳躬,那最多有256種不同的字符
- 思路要靈活,微觀難以實(shí)現(xiàn)甚亭,就從抽象的角度看贷币,比如這個(gè)題:
假定我們都知道非常高效的算法來(lái)檢查一個(gè)單詞是否為其他字符串的子串。請(qǐng)將這個(gè)算法編寫(xiě)成一個(gè)函數(shù)亏狰,給定兩個(gè)字符串s1和s2役纹,請(qǐng)編寫(xiě)代碼檢查s2是否為s1旋轉(zhuǎn)而成,要求只能調(diào)用一次檢查子串的函數(shù)暇唾。
給定兩個(gè)字符串s1,s2,請(qǐng)返回bool值代表s2是否由s1旋轉(zhuǎn)而成促脉。字符串中字符為英文字母和空格,區(qū)分大小寫(xiě)策州,字符串長(zhǎng)度小于等于1000瘸味。
測(cè)試樣例:
"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true
觀察可以發(fā)現(xiàn),旋轉(zhuǎn)先將原字符串分割成AB兩段够挂,再轉(zhuǎn)成BA的形式旁仿。那么將原串拼起來(lái),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函數(shù),自己實(shí)現(xiàn)也是很簡(jiǎn)單的:
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~