<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    努力,成長,提高

    在追求中進步
    數據加載中……
    用動態規劃算法對最大子串問題的java實現
    最大字串問題描述大概就是給定2個字符串,找出他們兩個共有的最長字符串。比如一個是"tabcfg"另外一個"abckj"那么最大子串就是"abc".
    動態規劃算法最重要的就是分解問題,找出遞歸。說一下我的思考思路,首先拿到2個字符串,如何找到最長子串呢?
    1.假設他們(字符串a,b)的頭字母不相同的話,那么分別去掉首字母比較,也就是說用a.subString(1)和b比較,用b.subString(1)和a比較,最長子字符串沒變吧?答案是肯定的。ok遞歸出現了,結束條件就是有一個字符串變空,返回值就是a和b的最長子串。
    b.假設他們頭字母相同,那么一直比較下去,知道兩者的第n個字母不相同,然后把前n-1個字母存為子字符串c,把a.subString(1)和b返回結果記為d,b.subString(1)和a返回結果記為e,那么返回c,d和e最長的一個(感謝lexy的評論,之前確實遺漏一種情況。不應該直接把前面的相同的去掉直接比較的,現在代碼已經更新了)。
    也許有人說應該從后面往前面比較,找到相同的然后一個個再往前比,其實道理都是一樣的,關鍵要找到分解問題的方法。這里只是拋磚引玉,下面是具體的java實現。
    import java.util.HashMap;
    import java.util.Map;
     
    /**
    @author HEACK
    *
    */
    public class CompareStr {
     
            
    /**
            * 
    @param args
            
    */
            
    public static void main(String[] args) {
                    
    // TODO Auto-generated method stub
                    String str1 = "abcde1234567abcdefghijk";
                    String str2 
    = "abcdefgh12345";
                   
                    
    //String str2 = "abc happyies dutcbirthday peter";
                    CompareStr cj = new CompareStr();
                    System.out.println(cj.getLongestString(str1,str2));
     
            }
     
            
    private boolean isEmpty(String str) {
                    
    return str == null || str.trim().length() == 0;
            }
            
    private Map map = new HashMap();
     
            
    private String getLongestString(String str1, String str2) {
                    
    if (isEmpty(str1) || isEmpty(str2)) {
                            
    return "";
                    }
                    StringBuffer key 
    = new StringBuffer();
                    key.append(str1).append(
    "&&").append(str2);
                    
    if (map.containsKey(key.toString())) {
                            
    return (String)map.get(key.toString());
                    }
                    StringBuffer longestStr 
    = new StringBuffer();
                    
    char[] str1List = str1.toCharArray();
                    
    char[] str2List = str2.toCharArray();
                    
    int i = 0;
                    
    for (i = 0; i < str1List.length && i < str2List.length; i++) {
                            
    if (str1List[i] == str2List[i]) {
                                    longestStr.append(str1List[i]);
                            } 
    else {
                                    
    break;
                            }
                    }
                    String subStr1 
    = str1.substring(i);
                    String subStr2 
    = str2.substring(i);
                    
    if (i == 0) {
                            String retStr1 
    = getLongestString(subStr1.substring(1), subStr2);
                            String retStr2 
    = getLongestString(subStr1, subStr2.substring(1));
                            String returnStr 
    = retStr1.length() >= retStr2.length() ? retStr1 : retStr2;
                            map.put(key.toString(), returnStr);
                            
    return returnStr;
                    } 
    else {
                            String retStr1 
    = getLongestString(str1.substring(1), str2);
                            String retStr2 
    = getLongestString(str1, str2.substring(1));
                            String retStr 
    = retStr1.length() > retStr2.length() ? retStr1
                        : retStr2;
                            String returnStr 
    = retStr.length() >= longestStr.toString().length() ? retStr
                                            : longestStr.toString();
                            map.put(key.toString(), returnStr);
                            
    return returnStr;
                    }
            }
     
    }

    HashMap用來存儲已經計算過的字符串,用空間換時間。代碼當然還可以優化,您也可以一試身手哦。

    posted on 2009-09-15 01:19 孔陽 閱讀(4436) 評論(7)  編輯  收藏

    評論

    # re: 用動態規劃算法對最大子串問題的java實現 2009-09-15 14:35 mui

    不知道這是不是個bug:
    String str1 = "asdfxfghj";
    String str2 = "fghjxasdf";
    輸出asdf。
      回復  更多評論    

    # re: 用動態規劃算法對最大子串問題的java實現[未登錄] 2009-09-15 14:40 孔陽

    @mui
    是這個問題的
    現在這個程序可能不會找到所有的同樣等長的最長字符串
    你這個返回的應該是asdf fghj
    這個只需要稍微修改一下程序即可
    如果字符串和當前最長的等長的話那么就添加到一個全局的list當中
    實現方法多種多樣:D
      回復  更多評論    

    # re: 用動態規劃算法對最大子串問題的java實現 2009-09-15 17:43 找個美女做老婆

    Java樂園交流社區(四) 歡迎廣大Javaer加入,大家一起交流,共同進步:
    群號:81107233

    Java樂園學習網站:http://www.javaly.cn
    有大量的學習資料,視頻教程。
      回復  更多評論    

    # re: 用動態規劃算法對最大子串問題的java實現 2009-09-16 14:27 lexy

    算法有問題。
    String str1 = "abcde1234567abcdefghijk";
    String str2 = "abcdefgh12345";
    返回:12345
    應該返回:abcdefgh 吧?
      回復  更多評論    

    # re: 用動態規劃算法對最大子串問題的java實現 2009-09-16 17:04 孔陽

    @lexy
    感謝lexy的提醒,現在代碼已經更新,原因在原文里面有說明:D
      回復  更多評論    

    # re: 用動態規劃算法對最大子串問題的java實現 2009-11-04 21:11 ddr

    在不考慮性能的情況下 ,看看我這段代碼能不能完成這個需求
    public String findMaxSubString(String str,String tarStr){
    String temp = "";
    if(str.length()>tarStr.length()){
    temp = str;
    str = tarStr;
    tarStr = temp;
    }
    temp = str;
    int strLength = str.length();
    for( ;strLength>0;strLength--){
    String temp_ =null;
    while(true){
    temp_ = str.substring(0,strLength);
    str = str.substring(1);
    if(tarStr.indexOf(temp_)>0)
    return temp_;
    if(str.length()<strLength){
    str = temp;
    break;
    }
    }
    }
    return null;
    }
      回復  更多評論    

    # re: 用動態規劃算法對最大子串問題的java實現 2011-12-07 15:02 flounders

    @ddr
    你的方式能很好的實現功能,不過性能太差了。。
      回復  更多評論    

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲av网址在线观看| 免费看美女被靠到爽| 久久夜色精品国产亚洲av| 羞羞漫画登录页面免费| 国产成人高清精品免费软件| 亚洲国产无线乱码在线观看 | 一级成人a毛片免费播放| 国产成人麻豆亚洲综合无码精品| 人人公开免费超级碰碰碰视频| 亚洲AV成人潮喷综合网| 国产精品免费看久久久香蕉 | 国产又大又黑又粗免费视频| 亚洲成a∨人片在无码2023 | 亚洲色大18成人网站WWW在线播放| 色妞WWW精品免费视频| 亚洲成av人片在线天堂无| 免费大片黄手机在线观看| 一级毛片大全免费播放下载| 亚洲码国产精品高潮在线| 国产一级片免费看| 亚洲精品国产福利在线观看| 国产日本一线在线观看免费| 亚洲色丰满少妇高潮18p| 免费a级毛片18以上观看精品| 大片免费观看92在线视频线视频| 亚洲日韩欧洲乱码AV夜夜摸| 最好看的中文字幕2019免费| 亚洲乱码一二三四区乱码| 四虎影视免费永久在线观看| 少妇性饥渴无码A区免费| 亚洲精品mv在线观看| 日韩高清在线免费观看| 国产精品免费一区二区三区| 亚洲国产精品久久久久| 女人张腿给男人桶视频免费版| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产一级大片免费看| 国产免费AV片在线观看| 亚洲不卡1卡2卡三卡2021麻豆| 亚洲国产成人久久精品99| 中文字幕免费高清视频|