1

わかりましたプログラマーとして、私たちは論理構築に関与するのが大好きですが、以下に述べるようなある種のパズルで空白になることがあります. これは宿題や仕事のようなものではなく、単にロジックとパフォーマンスの練習パズルであることを宣言させてください。

String S= peas,sugar,rice,soup

ここで重要なのは、単語の最後の文字が次の単語の最初の文字である必要があるなど、単語の最長チェーンの長さを調べて、可能な限り長いチェーンを作成し、最終的にそのチェーンの長さを計算することです。

今、私はある種の解決策を見つけようとしました

  1. コンマstringで区切る
  2. それらを追加しますlist
  3. 並べ替えlist など

しかし、今、さらにロジックを開発する方法私はロジックの開発が少し苦手なので、助けていただければ幸いです.半分以上のロジックが本来あるべきように適切でない場合は、単語の最長チェーンの長さを取得するための単純な並べ替えと完璧な方法が必要です. .

要約
入力: String S= peas,sugar,rice,soup.
出力: 4 つの単語の長さ (エンドウ豆 -> 砂糖 -> 米 -> スープ) または (スープ -> エンドウ豆 -> 砂糖 -> 米) など

4

4 に答える 4

1

OKKフレンズここに私が作ったロジックとコア部分があり、パズルが解けました

import java.util.Map;
import java.util.Stack;

public class CandidateCode 
{ 
public static int chainLength=0;
public static void main(String[] args) {
    String s= "peas,sugar,rice,soup";
    int chainLengthfinal=wordChain(s);
    System.out.println("final length:"+chainLengthfinal);
}
public static int wordChain(String input1)
{
    List<String> stringList = new ArrayList<String>();
    stringList= Arrays.asList(input1.split(","));
    boolean ischain = new CandidateCode().hasChain(stringList);
    if (ischain) {
     return chainLength;    
    }
    return 0;

}
Map<Character, List<String>> startsWith = new HashMap<Character, List<String>>();
Map<Character, List<String>> endsWith = new HashMap<Character, List<String>>();

private Character getFirstChar(String str) {
    return str.charAt(0);
}

private Character getLastChar(String str) {
    return str.charAt(str.length() - 1);
}

boolean hasChain(List<String> stringList) {
    for (String str : stringList) {
        Character start = getFirstChar(str);
        Character end = getLastChar(str);
        List<String> startsWithList;
        List<String> endsWithList;

        if (startsWith.containsKey(start)) {
            startsWithList = startsWith.get(start);
        } else {
            startsWithList = new ArrayList<String>();
            startsWith.put(start, startsWithList);
        }

        if (endsWith.containsKey(end)) {
            endsWithList = endsWith.get(end);
        } else {
            endsWithList = new ArrayList<String>();
            endsWith.put(end, endsWithList);
        }
        startsWithList.add(str);
        endsWithList.add(str);
    }

    Stack<String> stringStack = new Stack<String>();
    for (String str : stringList) {
        if (hasChain(stringList.size(), str, stringStack)) {
            System.out.println(stringStack);
            System.out.println("size "+stringStack.size());
            chainLength= stringStack.size();
            return true;
        }
    }

    return false;
}

private boolean hasChain(int size, String startString, Stack<String> stringStack) {
    if (size == stringStack.size()) return true;
    Character last = getLastChar(startString);
    if (startsWith.containsKey(last)) {
        List<String> stringList = startsWith.get(last);
        for (int i = 0; i < stringList.size(); i++) {
            String candidate = stringList.remove(i--);
            stringStack.push(candidate);
            if (hasChain(size, candidate, stringStack)) {
                return true;
            }
            stringStack.pop();
            stringList.add(++i, candidate);
        }
    }

    return false;
 }
}

上記のプログラムの出力は
[スープ、えんどう豆、砂糖、米] になります。

サイズ4 .

最終的な長さ: 4 .

于 2015-02-21T11:39:34.023 に答える
0

最大数と最小数を見つける必要があると思います。

  1. 文字列をコンマで分割する

  2. それらを list_item として追加します

  3. list_item1 と list_item2 を比較すると、最大値が list_item_X になります

  4. list_item3 と list_item4 を比較すると、最大値は list_item_Y になります list_item1 と list_item_X を比較すると、最大値は

  5. したがって、最大値は list_item_Z です。これはコードによる実装です。

$s = '豆、砂糖、米、スープ';
$list_items = 爆発(',', $s);
$lengths = array_map('strlen', $list_items);
echo "最短は " です。最小($長さ) . ". 最長は " . 最大($長さ);

于 2015-02-21T11:03:48.807 に答える