寫一個C#字符串解析程序代碼,邏輯是從前到后一個一個讀取字符,遇到匹配空格、Tab和換行符就繼續讀取下一個字符,遇到大寫或小寫的字符a,就讀取后一個字符并匹配是否為大寫或小寫的字符l,以此類推,匹配任意字符大寫或小寫的alter字符串,接著匹配空格、Tab和換行符,然后遇到匹配空格、Tab和換行符就繼續讀取下一個字符,如果匹配大寫或小寫的字符t,就讀取后一個字符并匹配是否為大寫或小寫的字符a,以此類推,匹配任意字符大寫或小寫的table字符串,接著匹配空格、Tab和換行符,將這段邏輯封裝為函數,全部匹配完成就返回true,否則返回false,優化一下算法的效率。
該實現在保證正確性的前提下通過以下方式優化效率:
- 避免使用正則表達式
- 減少字符比較次數
- 最小化內存分配
- 提前終止無效匹配
- 使用高效的低級字符操作
using System;public class StringParser
{public static bool ParseAlterTableString(string input){int index = 0;int length = input.Length;// 跳過前導空白if (!SkipWhitespace(input, ref index, length)) return false;// 匹配alterif (!MatchKeyword(input, ref index, length, "alter")) return false;// 匹配至少一個空白符if (!MatchAtLeastOneWhitespace(input, ref index, length)) return false;// 跳過中間空白if (!SkipWhitespace(input, ref index, length)) return false;// 匹配tableif (!MatchKeyword(input, ref index, length, "table")) return false;// 檢查剩余字符是否全部為空白SkipWhitespace(input, ref index, length);return index == length;}private static bool SkipWhitespace(string input, ref int index, int length){while (index < length && IsWhitespace(input[index])){index++;}return true;}private static bool MatchAtLeastOneWhitespace(string input, ref int index, int length){if (index >= length || !IsWhitespace(input[index])) return false;while (index < length && IsWhitespace(input[index])){index++;}return true;}private static bool MatchKeyword(string input, ref int index, int length, string keyword){int keywordLength = keyword.Length;if (index + keywordLength > length) return false;for (int i = 0; i < keywordLength; i++){char expected = char.ToLowerInvariant(keyword[i]);char actual = char.ToLowerInvariant(input[index + i]);if (expected != actual) return false;}index += keywordLength;return true;}private static bool IsWhitespace(char c){return c == ' ' || c == '\t' || c == '\n' || c == '\r';}
}
算法說明和優化:
- 單次遍歷:整個算法通過索引指針單次遍歷字符串,時間復雜度為O(n)
- 內存效率:僅使用基本變量存儲狀態,空間復雜度為O(1)
- 短路判斷:在發現不匹配時立即返回false,避免不必要的檢查
- 大小寫處理:使用char.ToLowerInvariant進行大小寫不敏感比較,避免文化區域差異
- 空白處理優化:
- 前導/中間/結尾空白統一處理
- 使用獨立方法處理空白跳過邏輯
- 確保alter和table之間有至少一個空白符
使用示例:
Console.WriteLine(StringParser.ParseAlterTableString("ALTER TABLE")); // True
Console.WriteLine(StringParser.ParseAlterTableString(" alter\t\nTable ")); // True
Console.WriteLine(StringParser.ParseAlterTableString("altERTABLE")); // False(缺少中間空白)
Console.WriteLine(StringParser.ParseAlterTableString("alter tab")); // False(table不完整)