背景是給定一個單詞,比如說least ,然後再給你一部英語字典,在裏面找出擁有相同字母的單詞(書中稱爲變位詞),比如有這樣一些,setal stale steal .etc...我實在是沒有這麼一部電子版的字典,所以乾脆自己生成了一部字典(當然字典裏的單詞都是亂七八糟的),然後我把給定的單詞也隨機產生,定爲是5包含五個字母的單詞,字典中的所有單詞也都是隻有5位數,(我後來這麼一算的話發現這個字典撐死只有26^5個單詞≈25^5=(100/4)^5=100^5/4^5=10,000,000,000 /1024≈10,000,000個單詞 )
這個方法最核心的就是要把所有單詞都分別排序,就是說,如果有一個單詞是thank,那麼排序以後是ahknt,看是不是變位詞只要看排序後是否相等即可
static void Main(string[] args)
{
int seed = 0;
string s0 = getRandomStr(5,seed);
seed++;
string s0_sort = sortStr(s0);
string t1 = "";
string t2 = "";
string t3 = "";
StopWatch sw1 = new StopWatch();//秒錶類,可以刪除,用於測試運行時間
StopWatch sw2 = new StopWatch();
int num = 10000000;//生成一部字典中單詞的數量
string[] s = new string[num];
sw1.setStart();
for (int i = 0; i < num; i++)
{
s[i] = getRandomStr(5,seed);
seed++;
}
Console.WriteLine();
sw1.setEnd();
sw2.setStart();
for (int i = 0; i < num; i++)
{
t = s[i];
t3 = sortStr(s[i]);
if (s0_sort== t3)
{
t2 += (t + " ");
}
}
sw2.setEnd();
Console.WriteLine("隨機選定的單詞是:" + s0);
Console.WriteLine("獲取的那些變位詞爲:" + t2);
Console.WriteLine("獲取字典所用的時間:" + sw1.getTime());
Console.WriteLine("查找所用的時間(包含排序的時間):" + sw2.getTime());
Console.ReadLine();
}
//隨機制造一個單詞
static string getRandomStr(int n,int seed)
{
Random r = new Random(seed);
string str = "";
int j;
for(int i = 0; i < n; i++)
{
j = r.Next(97,122);
str += (char)j;
}
return str;
}
//給單詞按照從a~z的順序排隊
static string sortStr(string str)
{
int count = str.Length;
string s = "";
int[] letterArray = new int[26];
for (int i=0; i < count; i++)
{
letterArray[(int)str[i]-97]++;
}
int t = 0;
for (int j = 0; j < 26; j++)
{
t=letterArray[j];
while (t > 0)
{
s += (char)(j + 97);
t--;
}
}
return s;
}
以下是結果
有這樣一些說明:
1.我的字典做的不好,有重複的單詞,這個從獲取的變位詞中也可以看到
2.之所以選的單詞只有5位,不是我不想刺激一點,只是,每增加一位,得到變位詞的概率越是小,就像買7位數的彩票肯定比買3位數的彩票容易中獎,而選擇5位,既能找到變位詞,又使得變位詞不是太多直至刷屏。
3.單詞的拼寫其實是有規律可循的,所以如果是拿一部真正的字典去尋找有的時候可以找到很多變位詞,就比如說在中國找一個同名同姓的人如果是名叫”李偉“的話應該很多的。但是有些名字,其實基本上根本不可能會有人取。