从java

时间:2015-12-11 10:09:30

标签: java algorithm pattern-matching

给定一个字符串str = ab12。 我试图生成如下模式

xbx2 ax1x abxx xx12

这是另一个让它有点清晰的例子:
原始字符串182d3c
所需模式:
18xdxc 182x3x 18xx3c 182dxx 18xxxx看到18是不变的,其他两个是不同的 x82dxc 1x2d3x xx2d3c 182dxx xx2dxx现在看到2d是不变的,其他的是不同的

等等......

  

请注意,任何模式中x的数量必须为偶数。

我尝试使用正则表达式但无济于事。 然后我认为可能是二元模式生成算法将有所帮助(它看起来有点像x的二进制模式),但我仍然没有。 :(

如果您需要更多信息请发表评论,我很乐意与您分享。

非常感谢任何帮助! 谢谢!

1 个答案:

答案 0 :(得分:1)

12个字符是安全限制。

您可以使用位掩码...迭代0 to 2^l - 1,(其中l =字符串的长度)并检查i的位表示,如果设置的位数是偶数。如果是,则将设置位的位置标记为x's并保留字符串的其余部分。

此算法具有复杂度O(l * 2^l),可以正常max(l) = 12。因此,操作次数将为2.4e4,这很容易在1s以内轻松实现。

编辑:根据要求,Java中的示例代码

EDIT2:用新的工作代码替换了以前的代码:)

import java.io.*;
import java.util.*;
import java.lang.*;

public class xes{
    public static String convert(int n, int l){
        StringBuilder s = new StringBuilder();
        int g = 0;
        while(n>0){
            int c = n%2;
            if(c==0)
                s.append("0");
            else{
                s.append("1");
                g++;
            }
            n/=2;
        }
        while(s.length()<l)
            s.append("0");
        if(g%2 == 0)
            return ("" + s.reverse());
        else
            return "-1";
    }

    public static ArrayList<String> getAllPatterns(String s){
        int l = s.length();
        int p = (1<<l) - 1;            //because you don't want all x's, so -1. 1<<l is same as power(2,l)
        ArrayList<String> arr = new ArrayList<String>();
        for(int i=1;i<p;i++){        //i started from i=1 since you don't want all characters visible in any string in arraylist...if you want, stat it with 0
            String z = convert(i,l);
            if(z.equals("-1"))
                continue;
            StringBuilder g = new StringBuilder(s);
            for(int j=0; j < z.length(); j++){
                if(z.charAt(j)=='1')
                    g.setCharAt(j,'x');
            }
            System.out.println(g);
            arr.add("" + g);
        }
        return arr;
    }

    public static void main(String args[]){
        ArrayList<String> patterns = getAllPatterns("1823");
    }
}

这是输出:

18xx
1x2x
1xx3
x82x
x8x3
xx23

对于另一个输入1823ab,我得到所有30个可能的(6C2 + 6C4)字符串作为输出:

1823xx
182xax
182xxb
18x3ax
18x3xb
18xxab
18xxxx
1x23ax
1x23xb
1x2xab
1x2xxx
1xx3ab
1xx3xx
1xxxax
1xxxxb
x823ax
x823xb
x82xab
x82xxx
x8x3ab
x8x3xx
x8xxax
x8xxxb
xx23ab
xx23xx
xx2xax
xx2xxb
xxx3ax
xxx3xb
xxxxab