在字典中查找變位詞的方法

背景是給定一個單詞,比如說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.單詞的拼寫其實是有規律可循的,所以如果是拿一部真正的字典去尋找有的時候可以找到很多變位詞,就比如說在中國找一個同名同姓的人如果是名叫”李偉“的話應該很多的。但是有些名字,其實基本上根本不可能會有人取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章