算法中的字符串问题(JAVA)

      今天做到了一道算法题,如下:求两个字符串的最大共子串长度,如"abcdkkk"和 "baabcdadabc",可以找到最长的公共子串是“abcd”,所以最大公共子串长度为4。

由这道题加上对一些资料的参考引发了我对几个问题的思考:

1.一个字符串的非空子串的求法

static void getAllStr(String all){
		String current = "" ;
		int sum=0;
		System.out.print("字符串"+all+"的所有非空子串有:");
		for (int i = 0; i < all.length(); i++) {
			for (int begin = 0, end = all.length() - i; end <= all.length(); begin++, end++) {
				current = all.substring(begin, end);
				sum++;
				System.out.print(current+" ");				
				}
			}
		System.out.println("\n个数为:"+sum);
		}

运行结果:


上面第二个for循环也就是

for (int begin = 0, end = all.length() - i; end <= all.length(); begin++, end++) 

特别值得注意,感觉很巧妙,就像是一个长度依次减小的窗口在从头到尾不停滑动,优点在于可以很快的求到字符串的最长子串与其他字符串匹配,并且可以直接找到长度。

遍历过程分析如下图:

算法中的字符串问题(JAVA)_第1张图片

2.非空子串求到了,但也许会有一些相同的值,也就出现了字符串数组如何去掉重复值

去掉重复值的方法很多,这里记录一种才get到的简单方法,直接使用set类,它自动帮你去掉了重复。。。代码如下:

	static void delDuplicate(String str[]){
		TreeSet tr = new TreeSet();
		System.out.print("去重之前:");
		for(String x:str){
			System.out.print(x+" ");
		}
		for(int i=0;i

3.字符串匹配问题

当求出字符串的子串过后再来做匹配字符串就更简单了,只需要先做一些判断再调用String类的contains()方法即可,代码如下:

	static int f(String s1, String s2) {
		// 参数检查
		if (s1 == null || s2 == null) {
			return 0;
		}
		String max = "";
		String min = "";
		if (s1.length() < s2.length()) {
			min = s1;
			max = s2;
		} else {
			min = s2;
			max = s1;
		}
		// 记录当前字符串
		String current = "";
		for (int i = 0; i < min.length(); i++) {
			for (int begin = 0, end = min.length() - i; end <= min.length(); begin++, end++) {
				current = min.substring(begin, end);
				if (max.contains(current)) {
					return current.length();
				}
			}
		}
		return 0;
	}

当然,匹配字符串还有其他一些方法,比如蓝桥杯的题目是一道填空题,它给出的代码就是一个动态规划的思路,动态规划需要掌握的更多,留待下次总结。

(PS:小白第一次发文,不对的地方恳请大佬纠正~~此文参考了一些他人的代码(感谢!)+自己的心得总结,如有雷同不必在意)

你可能感兴趣的:(算法笔记)