找到使用String中给定单词形成的最长链的长度

时间:2015-02-21 10:34:41

标签: java string algorithm logic longest-path

Okk作为程序员,我们喜欢参与逻辑构建,但事实并非如此,有些时候我们会因为下面提到的某种类型的谜题而变得空白。让我宣布这不是任何形式的家庭作业或工作,它只是一个逻辑和表演练习拼图。给出一个字符串 s`的拼图,用逗号分隔的单词如

String S= peas,sugar,rice,soup

现在症结在于找出单词最后一个字的最长链的长度应该是下一个单词的第一个字符,依此类推,以创建一个最长的链,最后计算该链的长度。

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

  1. 用逗号分隔string
  2. 将其添加到list
  3. 排序list
  4. 但是现在如何开发更多的逻辑由于我对逻辑开发有点不好,所以请帮助,如果超过一半的逻辑是不正确的,因为它应该比简单的排序和完美的方式来获得最长的长度一连串的话。

    概要
    输入String S= peas,sugar,rice,soup
    输出:4个字长(豌豆 - >糖 - >米 - 汤)或(汤 - >豌豆 - >糖 - >米)等等

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:0)

初始化&#34; &#34;名为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
      }   
}

如果你输入了一个legth 5序列并且它有一个并且有一个长度为6的序列,你想要计算并打印为输出,你必须将count变量存储在一个映射中,例如,作为与序列相关的关键到目前为止。然后你继续循环(你必须再次使brokenchain = false),直到输入字符串序列结束。然后你从你的地图中获得更大的密钥并用它的相关值(最大序列)打印出来

答案 3 :(得分: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,这里是通过代码实现的。

  6.   

    $ s ='豌豆,糖,米饭,汤';
          $ list_items = explode(',',$ s);
          $ lengths = array_map('strlen',$ list_items);
          回声“最短的是”。分($ length)。            “。最长的是”。 MAX($长度);