變位詞程式的實現

来源:http://www.cnblogs.com/zlofyao/archive/2017/08/06/7296296.html
-Advertisement-
Play Games

最近在看《編程珠璣》,挺有意思,驚嘆於作者思維的巧妙。閑來無事,就想著開了博客練練手。內容都是從書上的,我就用C#簡單實現了一下。鄙人只是剛出道的小小程式猿,第一次寫博客,實在寫不出太優秀的代碼,望看到的人多多見諒哈。。有錯誤或者意見啥的隨便提,也是我學習的機會。 書上的內容大致是:給定一個英語詞典 ...


    最近在看《編程珠璣》,挺有意思,驚嘆於作者思維的巧妙。閑來無事,就想著開了博客練練手。內容都是從書上的,我就用C#簡單實現了一下。鄙人只是剛出道的小小程式猿,第一次寫博客,實在寫不出太優秀的代碼,望看到的人多多見諒哈。。有錯誤或者意見啥的隨便提,也是我學習的機會。

   書上的內容大致是:給定一個英語詞典,找出其中的所有變位詞集合。例如:“pots”,“stop”和“tops”互為變位詞,因為每一個單詞都可以通過改變字目的順序來得到。

   因為手裡也沒詞典,就用24個字母隨機組合創建了一個詞典(並不是真正的單詞,字母隨機組合3-10位)。就是在txt裡邊一行一個單詞

      public static string[] Letter = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", 
"m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
/// <summary> /// 創建字典 /// </summary> /// <param name="count">要創建的單詞數</param> public static void CreateDictionary(int count) { using (FileStream fs = new FileStream(Path, FileMode.Create,FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8)) { Random r = new Random(); StringBuilder sb = new StringBuilder(); for (int k = 0; k < count; k++) { sb.Append(CreateWord(r)); sb.Append("\r\n"); } string words = sb.ToString(); sw.Write(words); } } } /// <summary> /// 模擬創建單詞 生成字典 /// </summary> /// <param name="r"></param> /// <returns></returns> public static string CreateWord(Random r) { string word = ""; //先隨機選擇一個單詞位數 4到10位 int bit = r.Next(3, 10); for (int i = 0; i < bit; i++) { word += Letter[r.Next(0,Letter.Length-1)]; } return word; }

 然後就是變位詞查詢的實現了,先對每一個單詞中的字母進行排序,再比較單詞是否相同即可。排序用冒泡排序,然後取出變位詞那裡的實現寫的實在不咋滴,實在是笨想不到好辦法,只好兩個數組都遍歷了一邊去查找。

        /// <summary>
        /// 開始查找
        /// </summary>
        public static string Search(string filePath)
        {
            if (!File.Exists(filePath))
            {
                return "文件不存在!";
            }

            Stopwatch watch = new Stopwatch();
            watch.Start();//開始計時
            string printfPath = filePath.Substring(0, 
            filePath.LastIndexOf('\\')) + "\\output.txt";//輸出路徑
            using (StreamReader sr = new StreamReader(filePath, 
            Encoding.UTF8))
            {
                string allWords= sr.ReadToEnd();
                string[] wordArrary = 
                System.Text.RegularExpressions.Regex.Split(allWords, 
     "\r\n", System.Text.RegularExpressions.RegexOptions.None);

                //用來接收排序後的單詞
                string[] sortArray = new string[wordArrary.Length]; 
                //1.先對每個單詞排序
                char[] array; //避免創建過多變數
                char temp ;
                for (int k=0;k< wordArrary.Length;k++)
                {
                     array= wordArrary[k].ToArray();
                    //使用冒泡排序對單詞每個字母排序
                    for (int i = 0; i < array.Length; i++)
                    {
                        for (int j =i+ 1; j < array.Length; j++)
                        {
                            if (array[i] > array[j])
                            {
                                temp = array[j];
                                array[j] = array[i];
                                array[i] = temp;
                            }
                        }
                    }
                    sortArray[k] = new string(array); //存入新數組
                }

                //2.判斷數組元素是否相同,相同則輸出
                using (StreamWriter sw = new StreamWriter(printfPath,false))
                {
                    int[] sign = new int[sortArray.Length]; //標記 0未查詢 1已查詢
                    for (int i = 0; i < sortArray.Length; i++)
                    {
                        Console.WriteLine("" + sortArray.Length + "個單 詞,......正在查詢到第" + (i + 1) + "");
                        if (sign[i] == 0)
                        {
                            sw.Write(wordArrary[i].ToString() + "    ");
                            for (int j = 0; j < sortArray.Length; j++)
                            {
                                if (i != j && sortArray[i] == sortArray[j])
                                {
                                    sw.Write(wordArrary[j].ToString() + "    ");
                                    sign[j] = 1;
                                }
                            }
                            sw.WriteLine();
                        }
                    }
                }

            }
            watch.Stop();//結束

            return "完成!共用時" + watch.ElapsedMilliseconds +"ms。請打開" + printfPath + "查看";
        }

 然後是main函數:

         /// <summary>
        /// 字典路徑
        /// </summary>
        public static string Path
        {
            get
            {
                return System.Environment.CurrentDirectory + "\\words.txt";
            }

        }

        static void Main(string[] args)
        {
            string filePath = "";
            Console.WriteLine("按1創建字典,按2執行輸入字典路徑並查找變位詞......");
            ConsoleKeyInfo key = Console.ReadKey();
            if (key.KeyChar.ToString() == "1")
            {
                Console.WriteLine("正在創建......");
                CreateDictionary(5*10000);
                Console.WriteLine("創建完成,任意鍵開始查找變位詞......");
                filePath = Path;
                Console.ReadKey();
            }
            else
            {
                Console.WriteLine("請輸入路徑......");
                filePath = Console.ReadLine();
            }

            //開始查找
            Console.WriteLine("正在查找......");
            Console.WriteLine(Search(filePath));

            Console.ReadKey();
        }

 

 速度實在有點慢。。。5萬單詞就用了20多秒,望高人指點指點=-=


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前面的隨筆,我介紹了Bootstrap-table表格插件的具體項目應用過程,本篇隨筆介紹另外一個Bootstrap FieInput插件的使用,整合兩者可以實現我們常規的Web數據導入操作,導入數據操作過程包括有上傳文件,預覽數據,選擇並提交記錄等一系列操作。關於這個插件,我在早期隨筆《Boot... ...
  • .NET 微服務:適用於容器化 .NET 應用的體繫結構 容器和 Docker 簡介 什麼是 Docker? Docker 術語 Docker 容器、映像和註冊表 為 Docker 容器選擇 .NET Core 還是 .NET Framework 通用指南 何時為 Docker 容器選擇 .NET ...
  • 當用戶在客戶端上請求本地圖片的時候,我們需要把本地的圖片展示。 1.在控制器端把圖片轉換成流的形式 2.前臺請求控制器端的方法,輸出圖片 控制器端: public class ImageController : Controller { private static readonly string ...
  • 基於 HtmlHelper 自定義擴展Container Intro 基於 asp.net mvc 的許可權控制系統的一部分,適用於對UI層數據呈現的控制,基於 HtmlHelper 的擴展組件 Code 基於 asp.net mvc 的許可權控制系統示例代碼:https://github.com/We ...
  • 前言 很多同學想對CAP的機制以及用法等想有一個詳細的瞭解,所以花了將近兩周時間寫了這份中文的CAP文檔,對 CAP 還不知道的同學可以先看一下 "這篇文章" 。 本文檔為 CAP 文獻(Wiki),本文獻同時提供中文和英文版本,英文版本目前還在翻譯中,會放到Github Wiki 中。 目錄 前言 ...
  • 本例演示在母版頁中的銨鈕事件去獲取某些子頁的內容。在母版本中,有一個銨鈕事件。當瀏覽某些子頁時,用戶點一點母版頁的銨鈕,能去獲取當前頁的內容。 子頁很多,但我們並不是每一個子頁的內容均要去獲取,而且每個子頁的內容不一樣。因此你需要讓父頁的事件知道,哪些子頁是需要獲取的。說白了,這就是平時所說的介面。 ...
  • 【申明】:本人.NET Core小白、Linux小白、MySql小白、nginx小白。而今天要說是讓你精通Linux ... 的開機與關機、nginx安裝與部署、Core的Hello World ...等。 首先,入門文章園子裡面已經很多了。這裡再做個整理和備忘。您也可以根據目錄挑著看。(親測多次可 ...
  • Tag Helpers 提供了在視圖中更改和增強現有HTML元素的功能。將它們添加到視圖中,會經過Razor模板引擎處理並創建一個HTML,之後再返回給瀏覽器。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...