今天在网上看到有一道算法题目:
求N个字符串中的最大公子串
http://www.iteye.com/topic/1118325
刚好闲着,做之。
先说一下思路:
1、从N个字符串中找出最小的字符串
2、分解出最小字符串最大公字符串列表:
例如:abcde
--------------------
abcde
abcd
bcde
abc
bcd
cde
ab
bc
cd
de
----------------------
3、分解出来的公子串从上到下去匹配其他的字符,都能匹配成功则是所要查找的最大公子串
4、如果同时存在两个相等长度的公子串 则以最先发现的为最大
说完上代码:
import java.nio.Buffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 求N个字符串中的最大公子串
*思路:
* 1、从N个字符串中找出最小的字符串
* 2、分解出最小字符串最大公字符串列表:
* 例如:abcde
* --------------------
* abcde
* abcd
* bcde
* abc
* bcd
* cde
* ab
* bc
* cd
* de
* ----------------------
* 3、分解出来的公子串从上到下去匹配其他的字符,都能匹配成功则是所要查找的最大公子串
* 4、如果同时存在两个相等长度的公子串 则以最先发现的为最大
*
*/
public class MaxPublicStr {
class Combination {
private CharBuffer a(char[] a, int[] tempNum, int m, int n, int startInd) {
for (int i = 0; i < n; i++) {
if (i >= startInd && i < (m + startInd)) {
tempNum[i] = 1;
} else {
tempNum[i] = 0;
}
}
return createResult(a, tempNum, m);
}
/**
* @param a:组合数组
* @param m:生成组合长度
* @return :所有连续的组合数组列表
*/
public List<CharBuffer> combinationsequence(char[] a, int m) {
List<CharBuffer> list = new ArrayList<CharBuffer>();
int n = a.length;
// 生成辅助数组。首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
int[] tempNum = new int[n];
for (int i = 0; i < tempNum.length; i++) {
if (i + m > n) {
break;
}
list.add(a(a, tempNum, m, n, i));
}
return list;
}
// 根据辅助数组和原始数组生成结果数组
@SuppressWarnings("unchecked")
public CharBuffer createResult(char[] a, int[] temp, int m) {
CharBuffer bos = CharBuffer.allocate(m);
for (int i = 0; i < a.length; i++) {
if (temp[i] == 1) {
bos.put(a[i]);
}
}
return bos;
}
}
public List<CharBuffer> combinationsequence(String str, int m) {
char[] a = str.toCharArray();
Combination c = new Combination();
List<CharBuffer> list = c.combinationsequence(a, m);
return list;
}
//字符串列表中的最短字符串
public String minStr(List<String> strings) {
return Collections.min(strings, new Comparator<String>() {
public int compare(String str1, String str2) {
if (str1.length() < str2.length())
return -1;
else if (str1.length() == str2.length())
return 0;
else if (str1.length() > str2.length())
return 1;
return 0;
}
});
}
//判断字符串列表中的每个字符串是否包含指定字符串,如果有一个不包含就返回false
public boolean contains(List<String> strings, String str) {
for (String s : strings) {
if (!s.contains(str))
return false;
}
return true;
}
public String maxSubString(List<String> strings) {
String shortStr = minStr(strings);
int i = shortStr.length();
//i是1 而不是0 因为当只有一个字符串的时候就没最大可言
while (i > 1) {
List<CharBuffer> list = combinationsequence(shortStr, i);
for (CharBuffer charBuffer : list) {
Buffer tempstr = charBuffer.rewind();
if (contains(strings, tempstr.toString())) {
return tempstr.toString();
}
}
i--;
}
return null;
}
public static void main(String[] args) {
MaxPublicStr max = new MaxPublicStr();
ArrayList<String> strings = new ArrayList<String>(Arrays.asList("ababcdghy", "abcdeftdsfgsdg", "abcdefsdf"));
String publicStr = max.maxSubString(strings);
System.out.println(publicStr);
}
}
分享到:
相关推荐
求N个字符串中的最大公子串(华为技能鉴定题) C语言版,可以参考
求N个字符串的最长公共子串,N,字符串长度不超过255。例如N=3,由键盘依次输入3个字符串为 Whatislocalbus? Namesomelocalbuses. loca1busisahighspeedI/Obusclosetotheprocessor. 则最长公共子串为“local...
本主题将深入探讨如何使用C++语言来实现一个算法,该算法能够找出两个字符串中的最大公共子串。公共子串是指同时存在于两个或多个字符串中的任意非空字符序列。在本问题中,我们目标是找到最长的这样一个子串。 ...
有一个共N个字符的字符串,存放在buff的存储区中,在字符串中查找“空格”(ASCII码为20h)字符,找到则在屏幕上输出FOUND!,没有找到则输出NOT FOUND!。
C语言编程-编写函数fun求一个字符串的长度,在main函数中输入字符串,并输出其长度;
根据给定的文件信息,我们可以总结出以下关于“求一个字符串中的连续出现次数最多的字串”的相关知识点: ### 一、问题定义与分析 #### 1.1 问题背景 在计算机科学中,字符串处理是常见且重要的任务之一。本问题是...
在计算机科学中,回文字符串是一个特殊的字符串,它正读反读都是一样的,比如"abcba"和"abccba"。本题目的重点在于如何编写C++代码来找到输入字符串中的最大回文子串及其长度。这个问题是字符串处理和算法设计的经典...
求一个字符串中字母的个数,以及一个字符串中数字的个数,相对于用C语言能更好地实现了算法的利用率的最大化,省去了C语言中用指针来定义字符串的环节,从来让程序变得更加整洁,易懂。
在C#中,处理字符串时,我们经常需要从一个较大的字符串中提取出特定部分,比如位于两个已知字符串之间的子串。这在解析日志、处理配置文件或者从HTML源码中提取信息时非常常见。标题中的“字符串提取(获取两个字符...
C语言程序设计-编写函数fun(str,i,n),从字符串str中删除第i个字符开始的连续n个字符(注意str[0]代表字符串的第一个字符);.c
创建一个新的VI,将“删除字符”和“字符串长度”这两个函数添加到程序框图中。连接字符串输入到这些函数,然后将它们的输出连接到适当的控件或指示器,以在前面板上显示结果。 5. **运行项目**: 描述中提到项目...
这两个函数都包含在`<string.h>`头文件中,它们的主要区别在于查找的方向:`strchr()`从字符串的起始位置向后查找,而`strrchr()`则从字符串的末尾向前查找。 **strchr()函数** `strchr()`函数的原型为: ```c ...
【问题描述】编写函数itob(n,s,b),用于把整数n转换成以b为基的字符串并存储到s中. 编写程序,使用函数itob(n,s,b)将输入的整数n,转换成字符串s,将s输出.转换后的字符串从最高的非零位开始输出。如果n为负数,则输出的...
总结来说,解决“求字符串中出现相同且长度最长字符串”的问题,我们可以运用滑动窗口、哈希映射或动态规划等技术。在实际编程中,应根据数据规模和性能要求选择合适的方法。对于给定的示例字符串,最终输出应为...
找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad" 主要用的是矩阵的思想
首先,LabVIEW中的字符串是以字符数组的形式存在的,每个字符串元素都是一个独立的数据项,可以在前面板上以字符串控件或指示器显示。字符串数组则是由多个这样的字符串组成的,每个元素都占据数组的一个槽位。 要...
在LabVIEW中处理字符串是一项常见的任务,尤其是将一个字符串拆分成多个子字符串,这通常涉及到字符串的分割操作。本篇将详细介绍如何在LabVIEW中实现“字符串拆分到数组”并支持中文字符。 一、字符串拆分的基本...
本主题关注的是如何查找一个字符串中出现重复次数最多的字符。这是一个典型的字符串处理问题,对于理解字符串操作和优化算法能力的提升非常有帮助。 首先,我们要明确问题的目标:给定一个字符串,找出其中出现频率...
在字符串处理中,我们需要判断字符串中的每个字符是否为数字字符。我们使用了if语句来判断字符是否在'0'到'9'之间,如果是则表示该字符为数字字符。 知识点3:数字转换 在本文档中,我们使用了减法操作来将字符...
输入一个长度不超过100的字符串,求出这个字符串的长度(不能使用strlen())