思想:通过s1+s1获得一个字符串,判断s2是否是s1的子串即可。
代码:
public boolean isFlipedString(String s1, String s2) {
if(s1 == null || s2 == null) return false;
if(s1.length() != s2.length()) return false;
return (s1+s1).contains(s2);
}
思路:本题采用树的序列化思想来解决
首先对树按照前序、中序或后续的方式进行序列化。(前序有坑,需注意避开)序列化成字符串后,比较字符串是否包含即可。
代码:
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root == null || subRoot == null) return false;
return postSerialized(root).contains(postSerialized(subRoot));
}
private String postSerialized(TreeNode node){
StringBuilder sb = new StringBuilder();
postSerialized(node,sb);
//StringBuilder类型转换成String类型
return sb.toString();
}
private void postSerialized(TreeNode node,StringBuilder s){
if(node.left == null){
s.append("#!");
}else{
postSerialized(node.left,s);
}
if(node.right == null){
s.append("#!");
}else{
postSerialized(node.right,s);
}
s.append(node.val).append("!");
}
思路:1.可以用哈希表来解决此问题,但是哈希表应用到此问题上有点重。本题可以参照哈希表的思想。
2.存储一个能存放26位字母的哈希表,哈希表的value代表字母出现的次数。
3.同时遍历s和t两个字符串,s字符串出现的字符,在对应位置++,t字符串出现的字符, 则--;
代码:
public boolean isAnagram(String s, String t) {
if(s == null || t == null) return false;
char[] s1 = s.toCharArray();
char[] t1 = t.toCharArray();
if(s1.length != t1.length) return false;
int[] counts = new int[26];
for(int i = 0;i < s1.length;i++){
counts[s1[i] - 'a']++;
}
for(int i = 0;i<s1.length;i++){
if(--counts[t1[i] - 'a'] < 0) return false;
}
return true;
}