今天在网上看到有一道算法题目:
求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...
根据给定的信息,本文将详细解释如何在SQL中实现截取用特定字符分割的字符串中的第n个子字符串。此需求通常应用于数据处理与分析场景中,尤其在处理半结构化或非结构化的文本数据时非常有用。 ### 核心知识点解析 ...
根据给定的文件信息,我们可以总结出以下关于“求一个字符串中的连续出现次数最多的字串”的相关知识点: ### 一、问题定义与分析 #### 1.1 问题背景 在计算机科学中,字符串处理是常见且重要的任务之一。本问题是...
标题提到的“C#中在一个字符串中删除另一个字符或字符串”涉及到的关键知识点主要包括字符串操作、字符数组、字符串替换以及正则表达式。以下将详细讲解这些知识点。 首先,C#中的字符串(`string`)是不可变的,这...
在计算机科学中,回文字符串是一个特殊的字符串,它正读反读都是一样的,比如"abcba"和"abccba"。本题目的重点在于如何编写C++代码来找到输入字符串中的最大回文子串及其长度。这个问题是字符串处理和算法设计的经典...
在C#中,处理字符串时,我们经常需要从一个较大的字符串中提取出特定部分,比如位于两个已知字符串之间的子串。这在解析日志、处理配置文件或者从HTML源码中提取信息时非常常见。标题中的“字符串提取(获取两个字符...
在链式字符串中,每个节点存储一个字符,最后一个节点的指针为NULL,表示字符串的结束。 接下来,我们要介绍链式字符串的基本操作: 1. **创建字符串**:创建链式字符串涉及分配新的节点并初始化其数据(字符)和...
本文实例讲述了C语言求两个字符串的最长公共子串的方法。分享给大家供大家参考。具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * ...
传入一个字符串和整数m,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串并打印出来。
这两个函数都包含在`<string.h>`头文件中,它们的主要区别在于查找的方向:`strchr()`从字符串的起始位置向后查找,而`strrchr()`则从字符串的末尾向前查找。 **strchr()函数** `strchr()`函数的原型为: ```c ...
在这个"rf.rar"压缩包中,我们看到涉及到RF字符串处理的三个关键知识点:RF字符串截取、RF字符串比较以及RF字符串切割。 1. RF字符串截取: 正则表达式提供了灵活的字符串截取方式。通过定义匹配模式,可以精确地...
总结来说,解决“求字符串中出现相同且长度最长字符串”的问题,我们可以运用滑动窗口、哈希映射或动态规划等技术。在实际编程中,应根据数据规模和性能要求选择合适的方法。对于给定的示例字符串,最终输出应为...
根据给定的信息,我们可以分析并总结出以下与“求字符串中的第一个数字”相关的知识点: ### 1. 字符串操作基础 #### 1.1 字符串简介 在 Java 中,`String` 类用于表示不可变的字符序列,即字符串。字符串在 Java ...
去掉重复的字符串及在第一个字符串中删除在第二个字符串中出现的字符两个程序,vs2013已经验证
必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到CmyString对象)、求字符串中的一个字符或改变字符串中的一个字符(采用重载[]),...
本主题关注的是如何查找一个字符串中出现重复次数最多的字符。这是一个典型的字符串处理问题,对于理解字符串操作和优化算法能力的提升非常有帮助。 首先,我们要明确问题的目标:给定一个字符串,找出其中出现频率...
在LabVIEW中处理字符串是一项常见的任务,尤其是将一个字符串拆分成多个子字符串,这通常涉及到字符串的分割操作。本篇将详细介绍如何在LabVIEW中实现“字符串拆分到数组”并支持中文字符。 一、字符串拆分的基本...
在字符串处理中,我们需要判断字符串中的每个字符是否为数字字符。我们使用了if语句来判断字符是否在'0'到'9'之间,如果是则表示该字符为数字字符。 知识点3:数字转换 在本文档中,我们使用了减法操作来将字符...
循环右移,也称为循环右滚动,是指将字符串中的每个字符向右移动固定位数,而最右边的字符则移动到字符串的开头。以下是三种实现方法的详细解释。 ### 方法一:逐个右移 这种方法是最直观的,通过遍历字符串,将每...