当前位置: 首页 > article >正文

判断两个字符串是不是旋转字符串

首先定义什么叫旋转字符串,首先要了解二叉树,用字符串变成一颗二叉树,比如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);
         }
    }


http://www.kler.cn/a/501042.html

相关文章:

  • 后端Java开发:第十二天
  • 【数据结构】第1天之Java中的数据结构
  • 基于Django的个性化餐饮管理系统
  • MySQL程序之:简要概述
  • 【Linux】文件 文件描述符fd
  • ECharts饼图下钻
  • 《探索鸿蒙Next上开发人工智能游戏应用的技术难点》
  • 【MySQL】NOT IN需要外部套一层SELECT
  • Linux 发行版介绍与对比:Red Hat、Ubuntu、Kylin、Debian
  • 百度视频搜索架构演进
  • Open FPV VTX开源之第一次出图
  • 【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
  • 【mysql】约束的基本使用
  • 《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)
  • ollama教程(window系统)
  • element plus 使用 el-tree 组件设置默认选中和获取所有选中节点id
  • Q_OBJECT宏报错的问题
  • Liunx-搭建安装VSOMEIP环境教程 执行 运行VSOMEIP示例demo
  • 网络安全-防火墙
  • DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决
  • 第41章 使用 Docker Compose 进行容器迁移的技术指南及优势
  • 二十三种设计模式-原型模式
  • 深度学习张量的秩、轴和形状
  • HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现
  • Redis数据库——Redis快的原因
  • Erlang语言的软件工程