【问题标题】:Find the length of longest chain formed using given words in String查找使用字符串中给定单词形成的最长链的长度
【发布时间】:2015-04-23 01:30:58
【问题描述】:

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

String S= peas,sugar,rice,soup

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

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

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

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

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

【问题讨论】:

    标签: java string algorithm logic longest-path


    【解决方案1】:

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

    【讨论】:

    • 如果可能的话,任何类型的代码都会更有帮助,因为上面的问题只是我的想法,所以我没有发布任何代码
    【解决方案2】:

    好的,朋友们,我的逻辑和核心部分已经解决了,我的难题得到了解决

    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

    【讨论】:

      【解决方案3】:

      初始化一个名为 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)直到输入字符串序列结束。然后你从你的地图中得到更大的键并用他的关联值(最大序列)打印它

      【讨论】:

        【解决方案4】:

        我认为您需要找到最大和最小的数字。

        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 "最短的是"。分钟($长度)。 “。最长的是”。最大($长度);

        【讨论】:

        • 请只使用 java,因为我不知道其他语言。再次抱歉
        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 2015-05-21
        • 2018-11-25
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        相关资源
        最近更新 更多