提示
1
到 10^5
之间。1
到 9
之间。思路
代码
/*
* 52ms
*/
public int pseudoPalindromicPaths(TreeNode root) {
List<String> paths=new ArrayList<>();
int ans=0;
getPath(root,paths,root.val+"");
for(String path:paths){
if(check(path)){
ans++;
}
}
return ans;
}
public boolean check(String path){
int[] counts=new int[10];
boolean flag=true;
int len=path.length();
for(char c:path.toCharArray()){
counts[c-‘0‘]+=1;
}
//长度为偶数
if(len%2==0){
for(int i=1;i<=9;i++){
if(counts[i]%2!=0){
flag=false;
break;
}
}
}else{
int oddCount=0;
for(int i=1;i<=9;i++){
if(oddCount>1){
flag=false;
break;
}
if(counts[i]%2==1){
oddCount++;
}
}
}
return flag;
}
public void getPath(TreeNode node,List<String> paths,String s) {
if(node.left==null&&node.right==null){
paths.add(s);
return;
}
if(node.left!=null){
getPath(node.left, paths, s+node.left.val);
}
if(node.right!=null){
getPath(node.right, paths, s+node.right.val);
}
}
使用位运算优化判断伪回文路径过程
思路
代码
/**
* 优化
* 通过位运算 判定是否为 伪回文路径
* 2ms
*/
private int count;
public int pseudoPalindromicPaths2(TreeNode root){
count=0;
if(root==null) return count;
dfs(root,0);
return count;
}
private void dfs(TreeNode node, int v) {
v^=(1<<node.val);//node节点的val为几就左移几位
if(node.left==null&&node.right==null){
if(v==0||(v&(v-1))==0){//判断是否为回文
count++;
}
return;
}
if(node.left!=null){
dfs(node.left, v);
}
if(node.right!=null){
dfs(node.right, v);
}
}
参考原文:
原文:https://www.cnblogs.com/yh-simon/p/12951468.html