给定一个字符串str = ab12
。
我试图生成如下模式
xbx2 ax1x abxx xx12
这是另一个让它有点清晰的例子:
原始字符串182d3c
所需模式:
18xdxc 182x3x 18xx3c 182dxx 18xxxx
看到18是不变的,其他两个是不同的
x82dxc 1x2d3x xx2d3c 182dxx xx2dxx
现在看到2d是不变的,其他的是不同的
等等......
请注意,任何模式中
x
的数量必须为偶数。
我尝试使用正则表达式但无济于事。
然后我认为可能是二元模式生成算法将有所帮助(它看起来有点像x
的二进制模式),但我仍然没有。 :(
如果您需要更多信息请发表评论,我很乐意与您分享。
非常感谢任何帮助! 谢谢!
答案 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