假設(shè)這有一個(gè)各種字母組成的字符串A,假設(shè)這還有另外一個(gè)字符串B。 從算法上講,什么方法能最快的查出所有字符串A里的字母在字符串B里都有?
業(yè)精于勤,荒于嬉;行成于思,毀于隨。
樓上答案的效率基本上是可以的 ... 不過(guò)還有一些優(yōu)化的空間 ... 如下 ...
<?php
$check_if_all_exist = function( $a, $b ) {
/* most effective way to traverse a string ... */
foreach( array_unique( str_split( $a ) ) as $a_single )
/* stop searching if we meet something not exists in $b ... */
if ( false === strpos( $b, $a_single ) )
/* all passes ..? */
return false; return true;
};
僅限原字符串只有字母數(shù)字的情況 ... 寬字符集的話(huà)會(huì)出錯(cuò) ...
效率方面 ... str_split() 和 array_unique() 這個(gè)組合完全沒(méi)有問(wèn)題 ...
這比一次 strlen() 之后循環(huán)執(zhí)行 substr() 效率要高很多 ... 這也是我能想到的效率最高的方式 ...
至于為什么沒(méi)有在最后進(jìn)行一次性 array_diff() 比較只是因?yàn)闆](méi)有必要 ...
我們只是想知道 是否 字符串 A
里面的元素在 字符串 B
里都有 ... 而不是都有 哪些 重復(fù) ...
一旦 字符串 A
里面出現(xiàn)了 字符串 B
里面沒(méi)有的元素立即停止就好 ...
我寫(xiě)了幾個(gè) testcase ... 最佳的情況是 $a 和 $b 都非常長(zhǎng) ... 我的算法效率大概是樓上算法的 1330% ...
平常情況也會(huì)快 20% - 50% 不等 ... 并且樓上三行代碼我也是三行 ... code 長(zhǎng)度相差也不會(huì)很多 ...
想來(lái)想去也想不到什么效率更高的方法了 ... 恩恩 ... 就是這樣啦 ...
為什么我嘗試了樓上幾位貼出來(lái)的方法怎么都不是樓主想要的答案?
菜鳥(niǎo)在這貼個(gè)供大家噴的代碼段
<?php
$a = 'aGasdjhyzxhjkASDqudhaTskjbFjlhicikgckzjhcjlasdyioyqweHyfhdspvuchvxcvnmaASDasydkasaSD';
$b = 'asdhnbvdhaSlsdhFDasTdhjkaAFsdhagdmnasdbasgdkasjdjagDfjagfhgzfhghzxjcjkahdajsgdGSkahd';
$a = str_split ( $a );
$b = str_split ( $b );
$c = array_flip ( $b );
$res = array ();
foreach ( $a as $index => $v ) {
if (empty ( $b [$c [$v]] ))
continue;
$res [] = $b [$c [$v]];
}
print_r ( array_unique ( $res ) );
平衡各種需求后的答案,PCRE 實(shí)現(xiàn),簡(jiǎn)單通用。嫌效率不夠的話(huà)可以去掉“u”修飾符(強(qiáng)制 UTF-8)。
<?php
function charsissubset($h, $n) {
return preg_match('/[^' . preg_quote($h) . ']/u', $n) ? 0 : 1;
}
echo charsissubset('abcddcba', 'abcde'); // false
echo charsissubset('abcddcba', 'abcd'); // true
echo charsissubset('abcddcba', 'badc'); // true
echo charsissubset('漢字', '字'); // true
echo charsissubset('漢字', '漢字'); // false
function check_if_all_exist($a, $b) {
$a_as_array = array_unique(str_split($a));
$b_as_array = array_unique(str_split($b));
return count(array_diff($a_as_array, $b_as_array)) <= 0;
}
這么寫(xiě)code比較短,執(zhí)行效率怎么樣就不得而知了
假設(shè)字符串都是小寫(xiě)字母吧,大小寫(xiě)混合的思路是一樣的 1.創(chuàng)建一個(gè)26的元素的bool型數(shù)組array 2.對(duì)字符串B進(jìn)行一遍掃描,array[B[i]-'a'] = 1,即把字符串B中出現(xiàn)的字母都映射到26個(gè)字母表的array數(shù)組中 3.對(duì)字符串A進(jìn)行一遍掃描,如果array[A[i] - 'a'] == 1,那么說(shuō)明A[i]在字符串B中有,array[A[i] - 'a'] == 0,則說(shuō)明A[i]在字符串B中沒(méi)有
時(shí)間復(fù)雜度O(strlen(A) + strlen(B)),不知道是否可以接受?
以前看到過(guò)一個(gè)算法 大概是這樣的把每個(gè)字符串中每個(gè)字符分別賦一個(gè)數(shù) 然后把兩個(gè)字符串中的數(shù)相乘 之后在用兩個(gè)結(jié)果相除 如果沒(méi)有余數(shù)則證明A全在B中
count( array_unique( str_split( $a ) ) ) == count( array_unique( str_split( $a.$b ) ) )
判斷一個(gè)字符串中的字符是否都在另一個(gè)中出現(xiàn)(算法) 我怎么感覺(jué)這個(gè)不要去硬用循環(huán)吧 比如樓上的 $a = 'aGasdjhyzxhjkASDqudhaTskjbFjlhicikgckzjhcjlasdyioyqweHyfhdspvuchvxcvnmaASDasydkasaSD'; $b = 'asdhnbvdhaSlsdhFDasTdhjkaAFsdhagdmnasdbasgdkasjdjagDfjagfhgzfhghzxjcjkahdajsgdGSkahd'; 這里好像是說(shuō)判斷 怎么搞成了查找? 如果是判斷 完全可以用 echo strreplace(strsplit($b),'',$a)==''?'都有':'不是都有';