1

Okk 作为程序员,我们喜欢参与逻辑构建,但有时我们会因为下面提到的某种谜题而变得空白,情况并非如此。让我声明,这不是任何形式的家庭作业或工作内容,它只是一个逻辑和性能练习难题。Okk 给定字符串s` 的难题,用逗号分隔,例如

String S= peas,sugar,rice,soup

现在的关键是找出单词的最长链的长度,例如单词的最后一个字符应该是下一个单词的第一个字符,依此类推,以创建可能的最长链,最后计算该链的长度。

现在我试图找出某种解决方案,例如

  1. string用逗号分割
  2. 将它们添加到list
  3. 排序list

但是现在如何开发进一步的逻辑由于我在逻辑开发方面有点差,感谢您的帮助,如果以上一半的逻辑不正确,那么它应该是简单的排序和完美的方法来获得最长的单词链的长度.

摘要
输入String S= peas,sugar,rice,soup
输出:4 个单词长度 (peas->sugar->rice->soup) 或 (soup->peas->sugar->rice) 等

4

4 回答 4

1

一旦有了列表(或数组),您就可以遍历数组检查您的条件(第 n 个单词的最后一个字母与第一个单词的第一个字母相等)并每次增加计数器。一旦条件为假,就退出循环。您的计数器将保留您需要的值。

于 2015-02-21T10:39:13.883 回答
1

好的朋友们,我制作的逻辑和核心部分得到了解决

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

初始化名为 last( String last=" ")的 " " 字符串

用逗号分割得到第一个字符串

子串字符串的最后一个字符并将其存储到last

boolean brokenchain=false;
length=0;
while(more string to split with comma)&&(!brokenchain){
     split string with comma
     substring to get first char
     if(first char!=last){
        brokenchain=true;
      }else{
         length++;
         get last char of this string with substring and store it to last
      }   
}

如果您输入了一个长度为 5 的序列并且它中断了,并且后面有一个长度为 6 的序列,您想对其进行计数并打印为输出,则您必须将计数变量存储在映射中,例如,作为键与序列相关联。然后你继续循环(你必须再次使 brokenchain=false)直到输入字符串序列结束。然后你从你的地图中得到更大的键并用他的相关值打印它(最大的序列)

于 2015-02-21T10:49:19.537 回答
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 = explode(',', $s);
$lengths = array_map('strlen', $list_items);
echo "最短的是"。分钟($长度)。“。最长的是”。最大($长度);

于 2015-02-21T11:03:48.807 回答