算法 - 按字典顺序排列最大的魔法子串

时间:2017-08-06 20:13:13

标签: java algorithm

我正在研究这个magical sub-string program,但我仍然坚持如何在我的Java程序中继续进行。

这是我的计划:

static String findLargest(String str) {
        String[] splits = str.split("");
        Set<String> set = new LinkedHashSet<String>();
        for (int i = 0; i < splits.length; i++) {
            if (splits[i].equals("0")) {
                continue;
            }
            int zeros = 0;
            int ones = 0;
            StringBuilder sb = new StringBuilder("");
            for (int j = i; j < splits.length; j++) {               
                if (splits[j].equals("0")) {
                    zeros++;
                } else {
                    ones++;
                }
                sb.append(splits[j]);
                if (zeros == ones && ones >= zeros) {
                    set.add(sb.toString());
                }
            }
        }
        set.remove(str);

        List<String> list = new ArrayList<String>(set);
        System.out.println(list);

        return null;
    }

使用这个程序,我能够在我的11011000变量中将给定输入字符串[10, 101100, 1100]的神奇子字符串作为list

现在,我正在努力解决如何从列表中删除101100的无效条目,然后使用元素10, 1100从我的输入11011000进行交换以获得最终结果11100100

如果还有其他替代方法,请指导我。

2 个答案:

答案 0 :(得分:0)

如果你的问题只是消除不需要的&#34; 101100&#34;从结果来看,这是答案

import java.util.ArrayList;
import java.util.HashMap;
import java.lang.*;
import java.util.Set;
import java.util.*;
public class HelloWorld{

     public static void main(String []args){
        findLargest("11011000");
     }
     public static String findLargest(String str) {
        String[] splits = str.split("");
        Set<String> set = new LinkedHashSet<String>();
        for (int i = 0; i < splits.length; i++) {
            if (splits[i].equals("0")) {
                continue;
            }
            int zeros = 0;
            int ones = 0;
            StringBuilder sb = new StringBuilder("");
            for (int j = i; j < splits.length; j++) {               
                if (splits[j].equals("0")) {
                    zeros++;
                } else {
                    ones++;
                }
                sb.append(splits[j]);
                if (zeros == ones && ones >= zeros) {
                    set.add(sb.toString());
                    j = i +1; // RESET THE INDEX ELEMENT TO SKIP THE SUBSTRING FROM CONSIDERATION
                    break;  // BREAK FROM THE LOOP
                }
            }
        }
        set.remove(str);

        List<String> list = new ArrayList<String>(set);
        System.out.println(list);

        return null;
    }
}

答案 1 :(得分:0)

我可以提供一些观点。 首先,获取所有神奇的子串并将它们作为一对开始和结束索引(l,r)存储在列表中; 其次,根据索引l对列表进行排序; 那些可能被交换的子串可以从相同的索引l获得。看看给出的例子“11011000” 该清单将有(0,7),(1,2),(1,6),(3,6),(4,5) 显然只有潜在的掉期是(1,2)(1,6)

处理这些子串具有相同的索引l将有助于找到潜在的交换子串,对它们进行排序以找到最大顺序。