[英]Compare first three characters of two strings
字符串s1和s2的長度始終為1或更高。
我怎樣才能加快速度呢?
int l1 = s1.length();
if (l1 > 3) { l1 = 3; }
if (s2.startsWith(s1.substring(0,l1)))
{
// do something..
}
正則表達式可能嗎?
這似乎很合理。 這對你來說真的太慢了嗎? 你確定這不是過早的優化嗎?
你的直覺是正確的。 新對象(substring())的創建速度不是很快,這意味着每個創建的對象也必須產生g / c開銷。
這可能會快得多:
static boolean fastCmp(String s1, String s2) {
return s1.regionMatches(0, s2, 0, 3);
}
if (s2.startsWith(s1.substring(0, Math.min(3, s1.length())) {..};
順便說一句,它沒什么緩慢的。 startsWith
具有復雜度O(n)
另一種選擇是比較char值,這可能更有效:
boolean match = true;
for (int i = 0; i < Math.min(Math.min(s1.length(), 3), s2.length()); i++) {
if (s1.charAt(i) != s2.charAt(i)) {
match = false;
break;
}
}
我的java不太好,所以我會在C#中給你一個答案:
int len = Math.Min(s1.Length, Math.Min(s2.Length, 3));
for(int i=0; i< len; ++i)
{
if (s1[i] != s2[i])
return false;
}
return true;
請注意,與您和Bozho的不同,這不會創建一個新的字符串,這將是您的算法中最慢的部分。
也許你可以做到這一點
if (s1.length() > 3 && s2.length() > 3 && s1.indexOf (s2.substring (0, 3)) == 0)
{
// do something..
}
這里缺少上下文:你想要掃描什么? 什么類型的申請? 預計運行的頻率如何?
這些很重要,因為不同的場景需要不同的解決方案:
其他解決方案也可能是相關的,具體取決於實際問題。
但是,如果你把它歸結為只比較兩個字符串的前3個字符,我相信這里給出的代碼片段和你將得到的一樣好 - 它們都是O(1)*,所以沒有大幅優化你可以做。
*唯一可能不成立的地方是,如果獲取字符串的長度是O(n)而不是O(1)(這是C ++中strlen函數的情況),這不是Java和C#字符串對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.