继往开来 吐故纳新
日历
网志分类
· 所有网志 (1024)
· 个人作品 (64)
· 软件设计 (33)
· 面向对象编程 (22)
· JavaAPI (44)
· Java开源工具 (36)
· Swing (34)
· Java语法细节 (39)
· 样式表CSS (12)
· XML (9)
· J2EE(JavaEE) (23)
· 算法数据结构 (64)
· 正则表达式 (4)
· 软件知识 (6)
· Java线程 (9)
· Web开发.Jsp/Servlet/Struts (20)
· 程序随想录 (7)
· Hibernate (7)
· Spring (5)
· J2SE 高级 (2)
· J2SE 高级 (0)
· Web开发.Ajax (16)
· Web开发.JavaScript (48)
· DB4O (2)
· Web开发.CSS/Html (22)
· C# (20)
· ERP (4)
· JDBC (1)
· 编程资源 (16)
· 编程感悟 (29)
· DB/Sql (13)
· VB (29)
· VC (2)
· 桌面脚本 (3)
· 新兴软件 (3)
· 英语学习 (21)
· 网文转载 (163)
· 职场风云 (40)
· 诗词歌赋 (32)
· 生活感言 (79)
· 生活常识 (0)
· 奇文共赏 (15)
· 财经纵横 (9)
· 未分类 (17)
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 偶要雷锋
· 豆瓣
· nczonline
· 当当网
· easyjf中文站
· Donews
· 天极Java文章列表
· W3CSchool
· taiten的BLOG
· Dojo中国
· Dojo
· Extjs.com
· Lifehack中文网志
· JaveEye的一个AS专题
· Banq's JDon
· Java 中文网址大全
· 梦想Java
· 360Doc个人图书馆
· java开源大全
· 我在硅谷动力的软件下载站
· 站长中国
· 随意贴
· CSS教学素材站
· java 参考中文站
· 面向构件与SOA社区
· 彩字生成
· 派派小说论坛
· 如坐春风
· 英语学习网
· BBC CHina
· www.dlbang.com
· 古文竖排格式在线转化工具
· 免费家谱
· 图片上传基地
· 风景壁纸
· 和风细雨
· MyC#BlogInCsdn

订阅 RSS

0251425

歪酷博客

开此博一为经验积累,二为资料收集,三为同道交流,四为资源共享.
« 上一篇: 【原创】求100以内的是连续三个素数和,本身也为素数的数 下一篇: 【原创】求最大价值轰炸目标 »
Junglesong @ 2008-06-28 16:44

求两字符串的公共子串,如abc123与123456的公共字串为123,基本想法是在长的字符串前面加上长度等于短字符串的空格前缀,然后拿短字符串与新字符串挨个匹配,匹配上的置上匹配字符,否则置上空格,这样的新串就包含了匹配字串和空格,再劈分放入set即可,重复的元素会被set略过去。

代码如下:
package com.sitinspring;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 求两字符串的公共子串,如abc123与123456的公共字串为123
 * 
 * 
@author sitinspring(junglesong@gmail.com)
 * 
@since 2008-6-12 下午02:04:06
 * @vsersion 1.00 创建 sitinspring 2008-6-12 下午02:04:06
 
*/

public class CommonChildString{
    
private static final char Space = ' ';
    Set
<String> commonChildStrSet;

    
public CommonChildString(String str1,String str2){
        
// 在str1前加上与str2等长的空格,以免漏过前面的共同字串,这样做让str1也必然比str2长了
        str1=getPrefix(str2.length())+str1;

        
// 用来存放匹配字串,set能自动过滤掉重复的元素
        commonChildStrSet=new HashSet<String>();
        
for(int i=0;i<str1.length();i++){
            
// 先取字串
            String childStr=getSubString(str1,i, str2.length());
            
            
// 找字串和str2匹配的部分,匹配不上的位置上空格,如123和1a3匹配完变成1_1
            String commonStr=getCommonString(childStr,str2);
            
            
// 把匹配的结果按空格劈分后加入到Set中
            commonChildStrSet.addAll(getSplitResult(commonStr));
        }

    }

    
    
/**
     * 去掉空格部分,把不是空格的匹配字串取出放入到链表中返回
     * 
@param str
     * 
@return
     
*/

    
public List<String> getSplitResult(String str){
        List
<String> ls=new ArrayList<String>();
        
        str
=str.trim();
        
        String[] arr
=str.split("\s+");
        
for(String tmp:arr){
            
if(tmp.length()>0){
                ls.add(tmp);
            }

        }

        
        
return ls;
    }

    
    
    
/**
     * 返回长度为为n的空格字符串
     * 
@param n
     * 
@return
     
*/

    
private String getPrefix(int n){
        StringBuffer sb
=new StringBuffer();
        
for(int i=0;i<n;i++){
            sb.append(Space);
        }

        
        
return sb.toString();
    }

    
    
/**
     * 将op1和op2按位比较,相等取哪一位所在的字符,否则留为空格,比较结果返回
     *
     * 
@param op1
     * 
@param op2
     * 
@return
     
*/

    
public String getCommonString(String op1,String op2){
        StringBuffer sb
=new StringBuffer();
        
        
for(int i=0;i<op1.length();i++){
            
char c1=op1.charAt(i);
            
char c2=op2.charAt(i);
            
            sb.append(c1
==c2?c1:Space);
        }

        
        
return sb.toString();
    }

    
    
/**
     * 从str中从startIndex开始截取长度为length的子字符串
     * 
@param str
     * 
@param startIndex
     * 
@param length
     * 
@return
     
*/

    
private String getSubString(String str,int startIndex,int length){
        String strTmp
=str.substring(startIndex);    
        
int n=strTmp.length();
        
return strTmp.substring(0, length>n?n:length);
    }

    
    
public Set<String> getCommonChildStrSet() {
        
return commonChildStrSet;
    }

    
    
/**
     * 测试
     * 
@param args
     
*/

    
public static void main(String[] args){
        String op1
="123abc456";
        String op2
="abcdef123789655";
        CommonChildString commonChildString
=new CommonChildString(op1,op2);
        
// 输出观察
        System.out.print(op1+""+op2+"的匹配字串有:");
        
for(String tmp:commonChildString.getCommonChildStrSet()){
            System.out.print(tmp
+",");
        }

        System.out.print(
"\n");
    }

}

测试结果:
123abc456和abcdef123789655的匹配字串有:5,123,abc,6,


评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定