2011-11-16 81 views
0

我想基本上重新排列字母与关键字infront,因为我正在做一个简单的替代密码。我有种解决这个问题的逻辑,但我在编码方面有点困难。重新排列字母(VB)

我想要的是像什么:

Dim key = "keyword" 

    For i = 0 to 26 

    'insert keyword and put in A to Z after without duplicating characters 

    Next 


'output: keywordabcfghijlmnpqstuvxz 
+0

您能否给我们更多关于“规则”的内容?从目前为止,您不需要(for)循环...只需在'key'值前添加'abcfghijlmnpqstuvxz'。如果这不是您想到的完整方法,请让我们了解更多 – Nonym

+0

@NonymIty:他不想重复附录中关键字的字符。 –

+1

不应该是0到25吗? –

回答

3

我想通过按键循环比通过拼音循环清洁剂:

Dim key as string = "keyword" 

Dim alphabet As new StringBuilder("abcdefghijklmnopqrstuvwxyz") 

for each c As Char in key 
    alphabet.Replace(c.ToString(), Nothing) 
next 

return key & alphabet.ToString() 

或略微更有效的变化更换线路如下,以避免扫描字母表的所有26个字母在每次迭代:

alphabet.Replace(c.ToString(), Nothing, 0, 1) 
+1

这种解决方案变得更有效因为密钥变长:key.len x((26 + key.len)/ 2)次。 (字母变得更短,因为它被删除)。其他解决方案:26×key.len次。 –

+0

谢谢你的回复 –

+0

@GerhardPowell我同意这一个搜索少,但不是这一个key.len X alphabet.len/2(aka key.len X 26/2 aka key.len X 13)不包括收缩字母表。每次传球只会变得更好(更快)。你能详细说明你提到的'+ key.len'吗? – tcarvin

1

这里是VB中的解决方案:

Public Function words(key As String) As String 
    Dim ret As String 
    ret = key 
    key = key.ToLower() 
    For c As Char = "a"c To "z"c 
     If Not key.Contains(c) Then 
      ret = ret + c.ToString 
     End If 
    Next 

    Return ret 
End Function 

如果你想检查独特的字符为重点,那么你可以运行循环访问键的字符,如果已经存在,则删除当前的字符。请记住,如果删除字符,请将for循环移回一个字符。

+0

谢谢:)我会尝试删除字符,如果他们重复 –

3
Public Function Rearrange(keyword As String) As String 
    Dim cipher As New StringBuilder(26) 
    cipher.Append(keyword) 
    For c As Char = "a"C To "z"C 
     If Not keyword.Contains(c) Then 
      cipher.Append(c) 
     End If 
    Next 
    Return cipher.ToString() 
End Function 
+0

谢谢你的回复它真的帮助 –