判断两个字符串是不是旋转字符串
首先定义什么叫旋转字符串,首先要了解二叉树,用字符串变成一颗二叉树,比如abcd ,只要二叉树的中序遍历(要排除根节点)和abcd 一样就可以认为 是由这个字符串构造出来的,比如abcd 是父节点,然后它的左节点是a,右节点是bcd, bcd 的左节点是b,右节点是cd,cd的左节点是c, 右节点是d,不允许一个节点只有一个子树有值,要么都有要么都没有,在这个基础上再加上旋转,旋转就是指同一个节点的左右子树交换,这样中序遍历顺序也就跟着变了,
思路:穷举出给出字符串的可能。
private static void split(Node current,Node parent,List<String>result){
if(current.value.length()==1){
return ;
}
List<Node>leftNodes=new ArrayList<>();
List<Node>rightNodes=new ArrayList<>();
String rootStr = current.value;
for (int left = 0,end=current.value.length()-1; left <current.value.length()-1 ; left++) {
leftNodes.add(new Node(rootStr.substring(0,left+1)));
rightNodes.add(new Node(rootStr.substring(left+1,end + 1)));
}
for (int i = 0; i <leftNodes.size() ; i++) {
current.left=leftNodes.get(i);
current.right=rightNodes.get(i);
split(current.left,parent,result);
split(current.right,parent,result);
if(current!=parent) {
StringBuffer sb=new StringBuffer();
travel(parent,sb);
result.add(sb.toString());
}
current.left=rightNodes.get(i);
current.right=leftNodes.get(i);
split(current.left,parent,result);
split(current.right,parent,result);
if(current!=parent) {
StringBuffer sb=new StringBuffer();
travel(parent, sb);
result.add(sb.toString());
}
}
}
这里其实还是会产生重复的值,因为是深度优先的递归,所以在递归结束往上返回到父节点的时候会再次记录一次,
二叉树的中序遍历
static void travel(Node head,StringBuffer sb){
if(head.left!=null||head.right!=null) {
travel(head.left, sb);
travel(head.right,sb);
}else{
sb.append(head.value);
}
}