C 統計子字串出現次數

2021-08-25 10:03:33 字數 1612 閱讀 2982

c#中沒有統計子字串出現次數的函式,那麼如何在c#求出字串中某字元的出現次數,比如求「adsfgehergasdf」中「a」出現的次數。首先想到的方法當然是從頭遍歷字串並統計:

c1 = 0;

for (int i = 0; i < str.length; i++)

}第二種方法也很容易想到,將字串中所有要查詢的字元去除,然後比較去除前後的字串長度即可。這種方法遭到了某人的鄙視,據說效能很差而且多佔空間。

c2 = str.length - str.replace("a", string.empty).length;

接下來某人又提出了第三種方法,是用要查詢的字元為分隔符,將原字串分隔為多個子串,然後求子串的數目即可。在c#中這是乙個寫起來很短的方法:

c3 = str.split(new char ).length - 1;

我們從原理可以推斷出三者效能的順序,但究竟差距是多少呢,還是要動手試驗一下。這是非常經典的測試**:

string str = "sadthdgsafsdgtghrdgsadfaddrhdfsgasdaa";

stopwatch sw = new stopwatch();

long t;

int c = 0;

gc.collect();

sw.start();

for (int i = 0; i < 100000; i++)

sw.stop();

t = sw.elapsedmilliseconds;

首先我們確保正確性,經測試三種方法都能正確處理多種情況,包括首尾、連續出現、不出現或串長度為0等,我所取的字串是乙個很普通的串。編譯為release版,預執行10次後獲得以下結果:

遍歷統計:13毫秒

替換後比較長度:112毫秒

斷開字串後計數:233毫秒

這裡已經體現出差異,遍歷統計比替換後比較要快10倍,斷開字串又要慢一些。接下來我又做了如下兩個測試:

1、不改變字串的長度,增加或減少要查詢字串的個數。

2、不改變要查詢字元出現的頻率,但增長字串的長度。

結果發現,三種方法都隨字串長度增加線性變慢,而後兩種方法還隨要查詢的字元增加而變慢。斷開字串的方法還受要查詢字串分布情況的影響。

c1 = 0;

for (int i = 0; i < str.length; i++)

}

c2 = str.length - str.replace("a", string.empty).length;

c3 = str.split(new char ).length - 1;

public static int containcount(string input, char value, bool ignorecase)

}int count = 0;

for (int i = 0; (i = input.indexof(value, i)) >= 0; i++)

return count;

}

統計字串出現次數重排輸出

樣例 輸入 aabbcddd 輸出 a 2 b 2c 1 d 3abcdabdd 統計字串次數 主要使用sl的map會很快實現,具體參考 上面參考的第三種方法是最快的,但是我不是太理解,所以還是使用比較好理解的第二種方法統計字串出現的次數吧 最後輸出格式 最後輸出將重複的字元分別順序輸出,然後重複該...

統計字串出現次數(10分)

題目內容 從鍵盤輸入兩個字串,輸出第二個串在第乙個串 現的次數。如果沒有,輸出 no 輸入格式 輸入兩個字串輸出格式 輸出第二個串在第乙個串 現的次數。如果沒有,輸出 no輸入樣例1 this is his book 回車 is 回車 輸出樣例1 3 回車 輸入樣例2 this is my book...

統計字串中字元出現次數(延伸)

統計字串中字元出現的次數 1.簡單統計次數 returnstrnum function str,who for var i 0,l str.length i l i return strnum who console.log that.returnstrnum sgdgfdgrrgdv g 4 說明...