转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6851631.html 

(解题金句:其他问题字符串化,然后调用String类封装方法解决问题; 字符串问题数组化,然后操作字符数组解决问题。)

(从字符串中寻找某种性质的子串问题,与从二叉树中寻找某种性质的子树相类似,解题思路为从头到尾模拟拼写字符串的过程,对拼写过程中的每一个字符,对已拼写的子串的进行性质判断,更新相关信息。当拼写到结尾时,记录下的信息即为所求。)

一:字符串问题简述

字符串相关问题通常有以下特性:

1:字符串数组化:对于一个字符串,通常看作一个字符数组来处理,常见的有数组排序、调整、查找等。

2:其他问题字符串化:很多问题可以用字符串来模拟、处理

关于字符串的一些常见概念:

1:回文:一个字符串,从左到右读和从右到左读是完全一样的。

2:子串:字符串中任意个连续的字符组成的子序列称为该串的子串。

3:子序列:子序列就是在原来字符串中找出一部分字符(不强制连续)组成的序列。

4:递增子序列: 首先它是子序列,其次它们的元素是递增的。

5:最长子序列:子序列中元素的个数是最多的那一序列。

6:公共子序列:子序列的元素必须在两个字符串中都要出现。

7:前缀树:从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

8:后缀树:后缀树中存储的关键词为所有的后缀。

9:字符串匹配:其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。常见算法有暴力搜索(Brute force),KMP, BM(Boyer Moore)等等。【注:一般面试问匹配算法的实现思路,而做题则是使用匹配结果即可,Java中封装了String.contains()/String.indexOf()方法了】

常见字符串操作:

1:替换

2:变形

3:拼接

常见字符串题型:

1:规则判断:字符串是否符合某种规则、格式

2:模拟数字运算

3:字符串数组化处理:字符数组的调整、查找、排序等

4:字符统计问题

5:动态规划:最长公共子串、最长公共子序列、最长回文子串、最长回文子序列...

6:搜索类型:用DFS/BFS模拟字符串变换的过程,从中获取解

7:字符串匹配问题:从str1中查找str2

二:两棵树拓扑结构比较问题

给出两棵二叉树树,判断树2是否为树1的某棵子树。

解法:按照同一种遍历规则,序列化两棵二叉树,把问题转化为字符串匹配问题——str1中是否包含str2子串。

public static void preOrder(TreeNode root,ArrayList<String> pre){if(root==null){//1:遍历到叶子结点的左右儿子,用#表示空结点pre.add("#");return;}Integer value=root.val;pre.add(value.toString());preOrder(root.left,pre);preOrder(root.right,pre);}public static boolean chkIdentical(TreeNode A, TreeNode B) {ArrayList<String> listA=new ArrayList<String>();ArrayList<String> listB=new ArrayList<String>();//遍历两棵树
        preOrder(A,listA);preOrder(B,listB);//把树的遍历结果转为字符串StringBuilder builderA=new StringBuilder();for(String i:listA){builderA.append(i);}String strA=builderA.toString();StringBuilder builderB=new StringBuilder();for(String j:listB){builderB.append(j);}String strB=builderB.toString();//判断A树序列中是否有B树序列return strA.contains(strB);}

三:变形词

    变形词定义:字符串str1中字符种类以及各字符出现次数,与字符串str2中种类及出现次数一致,则str1和str2互为变形词。

思路:使用两个hashMap,分别统计str1和str2中各字符出现次数即可。注意特殊情况:两字符串长度不同,则绝对不互为变形词。

public boolean chkTransform(String A, int lena, String B, int lenb) {if(lena!=lenb){return false;}char[] charsA=A.toCharArray();char[] charsB=B.toCharArray();HashMap<Character,Integer> mapA=new HashMap<Character,Integer>();HashMap<Character,Integer> mapB=new HashMap<Character,Integer>();for(Character ch:charsA){if(mapA.get(ch)==null){mapA.put(ch,1);}else{mapA.put(ch,mapA.get(ch)+1);}}for(Character ch:charsB){if(mapB.get(ch)==null){mapB.put(ch,1);}else{mapB.put(ch,mapB.get(ch)+1);}}        //如果字符种类数不一样,则直接返回falseif(mapA.size()!=mapB.size()){return false;}        //由于不知道具体哪些种类,那么直接取两字符串拼接,遍历拼接后字符串每个字符即可得到两字符串所有种类String sum=A+B;char[] sumchars=sum.toCharArray();for(Character ch:sumchars){if(mapA.get(ch)!=mapB.get(ch)){//无论哪一个字符,只有A,B中数量不相等,则返回falsereturn false;}}return true;}

字符串问题简述与两个基本问题的Java实现——判断二叉树拓扑结构关系与变形词...相关推荐

  1. 字符串题目---2判断两个字符串是否为变形词

    题目描述 给定两个字符串str1和str2,如果str1和str2中出现的字符种类出现的一样且每种字符出现的次数也一样,那么str1和str2互为变形词.请判断str1和str2是否为变形词 输入描述 ...

  2. 数据处理的两个基本问题---汇编学习笔记

    数据处理的两个基本问题 计算机是进行数据处理.运算的机器,那么有两个基本的问题就包含在其中: 要处理的数据在什么地方? 要处理的数据有多长? 我们定义两个描述性符号:reg和sreg. reg的集合包 ...

  3. 《汇编语言》第 8章 -数据处理的两个基本问题 检测点,实验7,总结

    第8章 数据处理的两个基本问题 (1)要处理的数据在什么地方? (2)要处理的数据有多长? 定义的描述性符号:reg(register)和sreg(segment register) reg包括:ax ...

  4. LeetCode简单题之仅执行一次字符串交换能否使两个字符串相等

    题目 给你长度相等的两个字符串 s1 和 s2 .一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符. 如果对 其中一个字符串 执行 最多一次字符串 ...

  5. java中判断两个字符(或者字符串相等)

    string a,b;//两字符串 在java中判断两个字符(字符串)相等,用a.equals(b); if(a.equals(b)){ //如果相等,返回值为true }else{ //如果不相等, ...

  6. 数据处理的两个基本问题05 - 零基础入门学习汇编语言42

    第八章:数据处理的两个基本问题05 让编程改变世界 Change the world by program 实验七:寻址方式在结构化数据访问中的应用 这个程序是到目前为止我们遇到的最复杂的程序,它几乎 ...

  7. 字符串html在线互转,将string 的字符串转换为HTML的两种方法

    将string 的字符串转换为HTML的两种方法 采用jquery对象转换 采用原生javascript中DOMParser的parseFromString方法实现 1.采用jquery实现 var ...

  8. java找出两个字符串中所有共同的子串_【Java笔记】

    Leetcode 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是, ...

  9. 判断两个字符串是否是变形词

    问题: 给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样并且每种字符出现的次数也一样,那么str1与str2互为变形词.请实现函数判断两个字符串是否互为变形词. 举例: s ...

最新文章

  1. Centos安装GD库
  2. C++/C++11中std::deque的使用
  3. npm i和npm_让您的NPM套件包含Jest和Codecov☂️
  4. 使用Spring进行统一日志管理 + 统一异常管理
  5. Matlab使用笔记
  6. kafka的topic和分区策略——log entry和消息id索引文件
  7. codeforces 808 E. Selling Souvenirs (dp+二分+思维)
  8. OpenGL延迟着色之三
  9. JAVA读取文件操作时路径的斜杠问题
  10. Java笔记-IO流的运用
  11. css js写在一起 vue_如何把vue2.0 和 animate.css合并在一起使用(详细教程)
  12. 在java中使用ffmpeg将amr格式的语音转为mp3格式
  13. 【python】matplotlib生成散点矩阵图
  14. 2003下安装Comodo pro (通用)
  15. 【转载】BROCADE交换机配置
  16. 黄聪:PHP 防护XSS,SQL,代码执行,文件包含等多种高危漏洞
  17. 「新手指南」如何在Mac上格式化U盘和移动硬盘?
  18. 字节跳动前端实习面试经历分享
  19. 日立JP1当选07年度制造业信息化杰出供应商
  20. cad打开卡死_在打开cad文件的时候会出现死机的状态

热门文章

  1. 最新大脑图谱研究表明,手部的运动区域也与整个身体相连
  2. linux nfs 读写性能,linux – Debian上的NFS性能问题
  3. 「一夜白头」有科学依据了,减压可返黑 | 哥伦比亚大学最新研究
  4. 还需要“注意力层”吗?一堆“前馈层”在ImageNet上表现得出奇得好
  5. 谷歌实现2种新的强化学习算法,“比肩”DQN,泛化性能更佳!|ICLR 2021
  6. 如何评价百度造车?字很少,事很大
  7. 华为开发者学院 | 卷积神经网络与图像处理,听这一节课就够了
  8. 谷歌官方TensorFlow开发者认证来了,吴恩达:学我的课,报名费五折
  9. Tom Mitchell、杨强、周志华共话算法未来,世界人工智能大会算法峰会报名中
  10. 用飞桨做自然语言处理:神经网络语言模型应用实例