国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

php 判斷一個(gè)字符串中的字符是否都在另一個(gè)中出現(xiàn)(算法)
迷茫
迷茫 2017-04-10 14:27:39
0
9
498

假設(shè)這有一個(gè)各種字母組成的字符串A,假設(shè)這還有另外一個(gè)字符串B。 從算法上講,什么方法能最快的查出所有字符串A里的字母在字符串B里都有?

迷茫
迷茫

業(yè)精于勤,荒于嬉;行成于思,毀于隨。

reply all(9)
劉奇

為什么我覺(jué)得這就是兩次循環(huán)


array_diff

迷茫

樓上答案的效率基本上是可以的 ... 不過(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í)行效率怎么樣就不得而知了

Ty80

假設(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 ) ) )
左手右手慢動(dòng)作

判斷一個(gè)字符串中的字符是否都在另一個(gè)中出現(xiàn)(算法) 我怎么感覺(jué)這個(gè)不要去硬用循環(huán)吧 比如樓上的 $a = 'aGasdjhyzxhjkASDqudhaTskjbFjlhicikgckzjhcjlasdyioyqweHyfhdspvuchvxcvnmaASDasydkasaSD'; $b = 'asdhnbvdhaSlsdhFDasTdhjkaAFsdhagdmnasdbasgdkasjdjagDfjagfhgzfhghzxjcjkahdajsgdGSkahd'; 這里好像是說(shuō)判斷 怎么搞成了查找? 如果是判斷 完全可以用 echo strreplace(strsplit($b),'',$a)==''?'都有':'不是都有';

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template