1. 程式人生 > >2. 給定一個 query 和一個 text,均由小寫字母組成。要求在 text 中找出以同樣的順序連 續出現在 query 中的最長連續字母序列的長度。例如, query 為“acbac”,text

2. 給定一個 query 和一個 text,均由小寫字母組成。要求在 text 中找出以同樣的順序連 續出現在 query 中的最長連續字母序列的長度。例如, query 為“acbac”,text

2. 給定一個 query 和一個 text,均由小寫字母組成。要求在 text 中找出以同樣的順序連 續出現在 query 中的最長連續字母序列的長度。例如, query 為“acbac”,text 為 “acaccbabb”,那麼 text 中的“cba”為最長的連續出現在 query 中的字母序列,因此, 返回結果應該為其長度 3。請注意程式效率。  [分值:20]

您的回答:(空)  (簡答題需要人工評分)

package com.interview;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 給定一個 query 和一個 text,均由小寫字母組成。
 * 要求在 text 中找出以同樣的順序連 續出現在 query 中的最長連續字母序列的長度。
 * 例如, query 為“acbac”,text 為 “acaccbabb”,那麼 text 中的“cba”為
 * 最長的連續出現在 query 中的字母序列,因此, 返回結果應該為其長度 3。請注意程式效率。
 */

/**
 * 剛開始思路有點偏,想要利用正則表示式,後來發現沒有必要...
 */
public class Test2 {
    public static void main(String[] args) {
        String query = "acbac";
        String text = "acaccbabb";
        boolean b = false;
        String result = "";
        List<String> list = new ArrayList<>();

        //中心思想
        //找到query的不同組合,然後看text中是否包含該組合就好
        System.out.println(text.contains("cba"));
        //i是最長連續字母序列的長度
        for (int i = query.length(); i >= 1; i--) {
            //組合數 j
            int j = (query.length() + 1) - i;
            //m是每個字串的長度起點
            for (int m = 0; m < j; m++) {
                String que = query.substring(m, m + i);
                //用來加快速度,如果list裡面包含有相同的字串就跳過
                if (list.contains(que)) {
                    continue;
                }
                //System.out.println(que);  //可以用來檢視輸出結果
                if (text.contains(que)) {
                    result = que;
                    b = true;
                    break;
                }
                list.add(que);
            }
            if (b) {
                break;
            }
        }
        System.out.println("字串為:" + result);
        System.out.println("長度為:" + result.length());
    }
}