一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc

gb2312iso 2011-10-19 05:54:27
一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc。求解答。。。
...全文
335 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
getserved 2011-10-20
  • 打赏
  • 举报
回复

public void test3(){
String str = "abczzacbca";
int strlen = str.length();
int findlen = 2;
int pointer = 0;
for(int i = 0; i < strlen - 2; i++){
String toFind = str.substring(pointer, pointer+findlen);
for(int j = pointer+2; j < strlen-2;j++){
String comp = str.substring(j,j+findlen);
System.out.println(find(str, toFind, comp, pointer, j,findlen));
}
pointer++;
}
}

public String find(String str, String toFind, String comp, int pointer, int compPointer, int findlen){
String found = "";
String lastFound = toFind;
if(toFind.equals(comp)){
findlen++;
toFind = str.substring(pointer,pointer+findlen);
comp = str.substring(compPointer+findlen);
if(pointer < compPointer){
found = find(str, toFind, comp, pointer, compPointer,findlen);
if(found == ""){
found = lastFound;
}
}
}
return found;
}

剑神一笑 2011-10-20
  • 打赏
  • 举报
回复

public static void main(String[] args) {
String s = "abczzacbca";
String temp = null;
int tempLen = 0;
char[] c = s.toCharArray();
Map<String, Integer> m = new HashMap<String, Integer>();
for (int i = 0; i < c.length - 1; i++) {
temp = c[i] + "" + c[i + 1];
tempLen = i + 1;
while (s.indexOf(temp.toString()) != tempLen) {
if (m.containsKey(temp.toString())) {
m.put(temp, m.get(temp) + 1);
} else {
m.put(temp, 1);
}
tempLen++;
if (tempLen >= c.length) {
break;
} else {
temp += c[tempLen];
}
}
}
Map<String, Integer> m1 = new HashMap<String, Integer>();
// 去掉值为1的子串
for (Entry<String, Integer> e : m.entrySet()) {
if (e.getValue() != 1) {
m1.put(e.getKey(), e.getValue());
}
}
if(m1.size()==0){
System.out.println("没有最长子串!");
}else{
// 取出最大的子串
int max = 0;
for (Entry<String, Integer> e : m1.entrySet()) {
if(e.getValue()>max){
max = e.getValue();
}
}
StringBuffer sb = new StringBuffer();
for (Entry<String, Integer> e : m1.entrySet()) {
if(e.getValue()==max){
sb.append(e.getKey());
sb.append(",");
}
}
System.out.println("最长子串为:"+sb.substring(0, sb.length()-1)+" 长度为:"+max);
}

}

没优化的
不知道对10000的字符串有没有效果
1000一下的应该是没问题的
qq497525725 2011-10-20
  • 打赏
  • 举报
回复
不会 围观。
qq497525725 2011-10-20
  • 打赏
  • 举报
回复
这个 真不会。
gb2312iso 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bill0605030109 的回复:]

abczzacbca,为什么zz不算啊?zz也是长2啊。。。应该是重复最多的吧。。
[/Quote]

找出最长的重复子串 zz 只出现过一次 而bc出现过两次
剑神一笑 2011-10-20
  • 打赏
  • 举报
回复
稍微优化了下:
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
String s = "abczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbca"
+"abczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbcaabczzacbca"
+"";
test1(s);
long endTime = System.currentTimeMillis();
System.out.println("花费时间为:"+((double)(endTime-startTime))/1000+"秒");
}

public static void test1(String s){
String temp = null;
int tempLen = 0;
char[] c = s.toCharArray();
Map<String, Integer> m = new HashMap<String, Integer>();
for (int i = 0; i < c.length - 1; i++) {
temp = c[i] + "" + c[i + 1];
tempLen = i + 1;
while (s.indexOf(temp)!=s.lastIndexOf(temp)) {
if (m.containsKey(temp.toString())) {
m.put(temp, m.get(temp) + 1);
} else {
m.put(temp, 1);
}
tempLen++;
if (tempLen >= c.length) {
break;
} else {
temp += c[tempLen];
}
}
}
System.out.println("s的长度为:"+s.length());
Map<String, Integer> m1 = new HashMap<String, Integer>();
// 去掉值为1的子串
for (Entry<String, Integer> e : m.entrySet()) {
if (e.getValue() != 1) {
m1.put(e.getKey(), e.getValue());
}
}
if(m1.size()==0){
System.out.println("没有最长子串!");
}else{
// 取出最大的子串
int max = 0;
for (Entry<String, Integer> e : m1.entrySet()) {
if(e.getValue()>max){
max = e.getValue();
}
}
StringBuffer sb = new StringBuffer();
for (Entry<String, Integer> e : m1.entrySet()) {
if(e.getValue()==max){
sb.append(e.getKey());
sb.append(",");
}
}
System.out.println("最长子串为:"+sb.substring(0, sb.length()-1)+" 长度为:"+max);
}
}



s的长度为:2000
最长子串为:bc 长度为:400
花费时间为:19.766秒

s的字符串为2000需要20秒 3000就会内存溢出 需要加大JVM内存
lhjtianji 2011-10-19
  • 打赏
  • 举报
回复
最长的当然是bc了,hashmap已经忘得差不多了,观望
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ousyuryu 的回复:]

10000个字符串搞组合?怎么想出来的啊
[/Quote]
貌似是面试题。。考hashmap的。。
ousyuryu 2011-10-19
  • 打赏
  • 举报
回复
10000个字符串搞组合?怎么想出来的啊
  • 打赏
  • 举报
回复
abczzacbca,为什么zz不算啊?zz也是长2啊。。。应该是重复最多的吧。。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧