0

こんにちは、私は面接の練習をしています。この問題に対するより良い解決策があるかどうか知りたいです。

キーString key="apple"と並べ替えられた文字列の配列を指定すると、String[] words ={apple, apples, bananaaple, orangebanana, pearapples}

できない場合はtrue、単語リストから単語を使用してキー文字列を取得するために連結できるときに戻る関数を作成します。false

私の考えは、キー文字列の 1 文字から始めて、ワールド リストからバイナリ検索を行い、存在する場合は残りの文字列を見つけることです。そうでない場合は、もう 1 文字増やして、同じことを行います。

私のコード:

 public static void main(String[] args){
        String[] words = {"apple", "apples", "bananaaple", "orangebanana", "pearapples"};

        String key = "apple";

        System.out.println(expanding(words,key));
    }


    public static boolean expanding(String[] words, String key){
        if(key.length()<1){
            return false;
        }

        for(int i=1; i<=key.length(); i++){
            String sub = key.substring(0, i);
            boolean found =search(words,sub,0,words.length-1);
            if(found){ //get next piece
                String theSubString =key.substring(i, key.length());
                if(theSubString.compareToIgnoreCase("")==0){
                    return found;
                }
                boolean re = expanding(words,theSubString );
                if(re)
                    return true;
            }
        }
        return false;
    }

    public static boolean search(String[] list, String key, int min, int max){
        if(min>max){
            return false;
        }
            int mid = (min+max)/2;
            if(list[mid].compareToIgnoreCase(key)==0){
                return true;
            }else if(list[mid].compareToIgnoreCase(key)<0){
                return search(list,key,mid+1,max);
            }else{
                return search(list,key,min,mid-1);
            }

    }

私の意見では、最良のケースは O(log n) である必要がありますが、最悪のケースはわかりません... 一度に 1 文字しか一致しない場合はおそらく O(n^2) です。

誰か私にもっとアイデアを教えてもらえますか?

4

2 に答える 2