字符串问题简述与两个基本问题的Java实现——判断二叉树拓扑结构关系与变形词
转载请注明原文地址: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实现——判断二叉树拓扑结构关系与变形词的更多相关文章
- java字符串大小写转换的两种方法
转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString { pu ...
- java中判断两个字符串是否相等的问题
我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...
- javascript消除字符串两边空格的两种方式,面向对象和函数式编程。python oop在调用时候的优点
主要是javascript中消除字符串空格,比较两种方式的不同 //面向对象,消除字符串两边空格 String.prototype.trim = function() { return this.re ...
- 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca
今天碰到一个算法题觉得比较有意思,研究后自己实现了出来,代码比较简单,如发现什么问题请指正.思路和代码如下: 基本思路:从左开始取str的最大子字符串,判断子字符串是否为str的后缀,如果是则返回st ...
- 对字符串进行简单的字符数字统计 探索java中的List功能
题目: 统计一个字符串中数字和字符串的个数,并分别进行排列,要求 1.数字,字符串可以从键盘获取. 2.储存在list 3.统计数字个数,字符串个数 4.把数字和字符串按从小到大的顺序输出 5.不能使 ...
- java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”
在javascript中有一个方法isDigit()使用来判断一个字符串是否都是数字,在java的字符串处理方法中没有这样的方法,觉得常常需要用到,于是上网搜了一下,整理出了两个用正则表达式匹配的判断 ...
- 【Java】判断字符串是否包含子字符串
JAVA里面判断: public static void main(String[] args) { String str="ABC_001"; if(str.indexOf(&q ...
- java 中判断字符串相等
今天写Java代码时遇到一个问题,就是关于判断两个字符串是否相等的问题.(刚尝试用SSH框架) 在大多编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的 ...
- Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践
Makefile的工作流程 http://c.biancheng.net/view/7091.html Makefile文件是什么? 我们教程主要是讲的是 Makefile .很多 Linux(Uni ...
随机推荐
- linux下vi操作Found a swap file by the name
当我在linux下用vi打开Test.java文件时 [root@localhost tmp]# vi Test.java 会出现如下信息: E325: ATTENTION Found a swap ...
- 推荐ThinkJS
之前在学习node.js时,写过一些例子和demo,偶尔也会有人发email问我node.js的一些问题.因为是二三年前写的东西,当时使用的第三方库和node.js的版本跟最新的可能有所不同甚至比较大 ...
- 【 D3.js 入门系列 --- 2 】 怎样使用数据和选择元素
本人的个人博客首页为: http://www.ourd3js.com/ ,csdn博客首页为:http://blog.csdn.net/lzhlzz/. 转载请注明出处,谢谢. 接着上一讲的内容,这 ...
- 字符串中单词的逆转,即将单词出现的顺序进行逆转。如将“Today is Friday!”逆转为“Friday! is Today”.
字符串中单词的逆转,即将单词出现的顺序进行逆转.如将“Today is Friday!”逆转为“Friday! is Today”. #include<iostream> #include ...
- 分享一个Panda C-60 维修心得
昨天丰臣国际搞了个汽车后备箱市场,说白了就是一帮闲的没事儿的"白领"大热天把自家闲置的东西拿过来练练摊,这个形式还是不错的,中间看到了一个熊猫的CD机,一眼就看上了,虽说CD早就过 ...
- [转]使用HackCube-Special分析胎压传感器信号
胎压无线传感器安全检测 我们团队之前也有用USRP和GNUradio对其他的胎压设备进行的安全检测,我不使用这套环境的原因是软件无线电的设备和笔记本已经算体积不小的一套设备,通常测试环境都在户外,在这 ...
- macOS Sierra10.12.5 显示允许任何来源
在终端输入:sudo spctl --master-disable即可.
- Windbg命令学习15(bp bm bu bl bc ba断点)
以下以skinhgy为例,windbg附加运行 1. bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会 ...
- IO流 简介 总结 API 案例 MD
目录 IO 流 简介 关闭流的正确方式 关闭流的封装方法 InputStream 转 String 的方式 转换流 InputStreamReader OutputStreamWriter 测试代码 ...
- Unicode与JavaScript详解 [很好的文章转]
上个月,我做了一次分享,详细介绍了Unicode字符集,以及JavaScript语言对它的支持.下面就是这次分享的讲稿. 一.Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的 ...