转载请注明原文地址: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);
}
}
//如果字符种类数不一样,则直接返回false
if(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中数量不相等,则返回false
return false;
}
} return true;
}

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

  1. java字符串大小写转换的两种方法

    转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString {          pu ...

  2. java中判断两个字符串是否相等的问题

    我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...

  3. javascript消除字符串两边空格的两种方式,面向对象和函数式编程。python oop在调用时候的优点

    主要是javascript中消除字符串空格,比较两种方式的不同 //面向对象,消除字符串两边空格 String.prototype.trim = function() { return this.re ...

  4. 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca

    今天碰到一个算法题觉得比较有意思,研究后自己实现了出来,代码比较简单,如发现什么问题请指正.思路和代码如下: 基本思路:从左开始取str的最大子字符串,判断子字符串是否为str的后缀,如果是则返回st ...

  5. 对字符串进行简单的字符数字统计 探索java中的List功能

    题目: 统计一个字符串中数字和字符串的个数,并分别进行排列,要求 1.数字,字符串可以从键盘获取. 2.储存在list 3.统计数字个数,字符串个数 4.把数字和字符串按从小到大的顺序输出 5.不能使 ...

  6. java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”

    在javascript中有一个方法isDigit()使用来判断一个字符串是否都是数字,在java的字符串处理方法中没有这样的方法,觉得常常需要用到,于是上网搜了一下,整理出了两个用正则表达式匹配的判断 ...

  7. 【Java】判断字符串是否包含子字符串

    JAVA里面判断: public static void main(String[] args) { String str="ABC_001"; if(str.indexOf(&q ...

  8. java 中判断字符串相等

    今天写Java代码时遇到一个问题,就是关于判断两个字符串是否相等的问题.(刚尝试用SSH框架) 在大多编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的 ...

  9. Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践

    Makefile的工作流程 http://c.biancheng.net/view/7091.html Makefile文件是什么? 我们教程主要是讲的是 Makefile .很多 Linux(Uni ...

随机推荐

  1. 寂静之地百度云在线观看迅雷下载A Quiet Place高清BT下载

      原名:A Quiet Place 地区:美国 语言:英语 / 美国手语 首播:2018-05-18(中国大陆) / 2018-03-09(西南偏南电影节) / 2018-04-06(美国) 电视台 ...

  2. 丑闻第三季 /全集Scandal迅雷下载

    丑闻 第三季 Scandal Season 3 (2013)本季看点:在经典美剧<老友记第一季>中饰演菲比的女星莉莎·库卓,即将加盟描写华府危机公关的ABC剧集<丑闻>(Sca ...

  3. 维京传奇第四季/全集Vikings迅雷下载

    英文全名Vikings,第4季(2015). 本季看点:<维京传奇>当第四季开始时,Ragnar已经病入膏肓,随时可能丧命.毫无疑问,权力斗争异常激烈,谁都想在Ragnar死后获得最大利益 ...

  4. 黑马day17 ajax&amp;实现username自己主动刷新

    1. regist.jsp文件 <%@ page language="java" pageEncoding="utf-8"%> <!DOCTY ...

  5. ProgressBar学习笔记,自定义横向进度条的样式(包含ActionBar上面的进度条)

     点显示进度条后→   android:max="100" 进度条的最大值 android:progress  进度条已经完成的进度值 android:progressDrawab ...

  6. [Android Pro] ESP和EBP 栈顶指针和栈底指针

    cp:  http://blog.csdn.net/hutao1101175783/article/details/40128587 (1)ESP:栈指针寄存器(extended stack poin ...

  7. Secondary NameNode 的作用

    https://blog.csdn.net/xh16319/article/details/31375197 很多人都认为,Secondary NameNode是NameNode的备份,是为了防止Na ...

  8. Apache的三种工作模式

    Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式. 它们分别是prefork,worker和event,它们同时也代表这Apac ...

  9. ss简单使用

    ss简单使用 ss即socket state. 1.常用语句 ss -l 显示所有处于监听的网络接口连接 ss -pl 显示所有处于监听的网络接口连接,及相应的进程名称.进号等 ss -t -a 显示 ...

  10. Django model 中设置联合约束和联合索引

    来自:https://blog.csdn.net/ding_312/article/details/81264910 class Cart(models.Model): user = models.F ...