获取字符串的所有组合

时间:2016-12-02 05:38:31

标签: java algorithm

我要求获得给定字符串的所有组合。 例如 我有一个数字字符串和一些特殊的字符

String chars="0123456789@#$%&";
String guessedPw="authentic";

所以我想得到像这样的组合

  1. $ authentic%4
  2. 正宗#@
  3. 5安培;正品
  4. authentic8
  5. 我应该如何改进我的方法以获得所有组合?

    这是我写的代码。

    但它并没有给我所有的组合。

    private static String combination(String prefix, String s, String pw, String md5Pw) {
        String pwFound = "";
        if (s.length() > 0) {
            // System.out.println(prefix + s.charAt(0) + pw);
    
            String tempPw1 = prefix + s.charAt(0) + pw;
            System.out.println("pw1 : " + tempPw1);
            if (md5(tempPw1).equals(md5Pw)) {
                // String tempPw1;
                pwFound = tempPw1;
    
                return pwFound;
    
            }
    
            String tempPw2 = pw + prefix + s.charAt(0);
    
    
            if (md5(tempPw2).equals(md5Pw)) {
                // String tempPw1;
                pwFound = tempPw2;
                return pwFound;
    
            }
    
            pwFound = combination(prefix + s.charAt(0), s.substring(1), pw, md5Pw);
            pwFound = combination(prefix, s.substring(1), pw, md5Pw);
        }
        return pwFound;
    }
    

3 个答案:

答案 0 :(得分:0)

如果你不想写自己的算法,你可以使用google。

尝试搜索:“Generate Permutations”。

例如,在此链接上:Generate all combinations from multiple lists有一个算法可供您使用(但有列表)。

B

但当然,还有很多其他方法。

答案 1 :(得分:0)

如果您想自己编写所有代码,那么这就是您应该如何解决问题=>
有一个特殊的字符说〜表示guessedPw,并创建另一个字符串说str = chars +"〜"。
首先,您需要查找str的所有可能组合,找到指数时间,然后对于每个找到的组合,您应该生成所有它的排列,这也是因子时间复杂。
和然后在最后的字符串中,你应该替换所有出现的'〜'用guessedPw,得到答案字符串。 在这里,您可以找到用于生成排列和组合的链接:
链接:http://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/
要找出组合,如果你有最大值,你可以使用位掩码。字符串中的64个字符,您要从中提取的组合。

答案 2 :(得分:0)

要创建新组合,您可以添加一个char作为前缀或添加一个char作为后缀。为避免重复,请在后缀存在时停止添加前缀

伪代码:

GenPass(CurrentString, boolAllowPrefix)

    check CurrentString, return it if good result

    check length limit, exit if too long

    for c in Chars 
        if (boolAllowPrefix)
             GenPass(Chars[i] + CurrentString, True)
        GenPass(s + Chars[i], False)

Delphi实现检查

procedure GenPass(s: string; bPrefix: Boolean);
var
  i: integer;
begin
  List.Add(s);
  if Length(s) = MaxLen then
    Exit;
  if bPrefix then
     for i := 1 to Length(Chars) do
        GenPass(Chars[i] + s, True);
   for i := 1 to Length(Chars) do
       GenPass(s + Chars[i], False);

端;