• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php 判断一个字符串中的字符是否都在另一个中出现(算法)

php 搞代码 4年前 (2022-01-25) 30次浏览 已收录 0个评论
文章目录[隐藏]

假设这有一个各种字母组成的字符串A,假设这还有另外一个字符串B。从算法上讲,什么方法能最快的查出所有字符串A里的字母在字符串B里都有?

回复内容:

假设这有一个各种字母组成的字符串A,假设这还有另外一个字符串B。从算法上讲,什么方法能最快的查出所有字符串A里的字母在字符串B里都有?

为什么我觉得这就是两次循环


array_diff

楼上答案的效率基本上是可以的 … 不过还有一些优化的空间 … 如下 …

<code><?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;};</code>

仅限原字符串只有字母数字的情况 … 宽字符集的话会出错 …

效率方面 … str_split() 和 array_unique() 这个组合完全没有问题 …

这比一次 strlen() 之后循环执行 substr() 效率要高很多 … 这也是我能想到的效率最高的方式 …

至于为什么没有在最后进行一次性 array_diff() 比较只是因为没有必要 …

我们只是想知道 是否 字符串 A 里面的元素在 字符串 B 里都有 … 而不是都有 哪些 重复 …

一旦 字符串 A 里面出现了 字符串 B 里面没有的元素立即停止就好 …

我写了几个 testcase … 最佳的情况是 $a 和 $b 都非常长 … 我的算法效率大概是楼上算法的 1330% …

平常情况也会快 20% – 50% 不等 … 并且楼上三行代码我也是三行 … code 长度相差也不会很多 …

想来想去也想不到什么效率更高的方法了 … 恩恩 … 就是这样啦 …

为什么我尝试了楼上几位贴出来的方法怎么都不是楼主想要的答案?
菜鸟在这贴个供大家喷的代码段

<code class="lang-php"><?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 ) );</code>

平衡各种需求后的答案,PCRE 实现,简单通用。嫌效率不够的话可以去掉“u”修饰符(强制 UTF-8)。

<code><?phpfunction charsissubset($h, $n) {    return preg_match('/[^' . preg_quote($h) . ']/u', $n) ? 0 : 1;}echo charsissubset('abcddcba', 'abcde'); // falseecho charsissubset('abcddcba', 'abcd'); // trueecho charsissubset('abcddcba', 'badc'); // trueecho charsissubset('汉字', '字'); // trueecho charsissubset('汉字', '漢字'); // false</code>

<code>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;}</code>

这么写code比较短,执行效率怎么样就不得而知了

假设字符串都是小写字母吧,大小写混合的思路是一样的1.创建一个26的元素的bool型数组array2.对字符串B进行一遍扫描,array[B[i]-‘a’] = 1,即把字符串B中出现的字母都映射到26个字母表的array数组中3.对字符串A进行一遍扫描,如果array[A[i] – ‘a’] == 1,那么说明A[i]在字符串B中有,array[A[i] – ‘a’] == 0,则说明A[i]在字符串B中没有

时间复杂度O(strlen(A) + strlen(B)),不知道是否可以接受?

+本文来源gao!%daima.com搞$代*!码9网(

搞gaodaima代码

以前看到过一个算法 大概是这样的把每个字符串中每个字符分别赋一个数 然后把两个字符串中的数相乘 之后在用两个结果相除 如果没有余数则证明A全在B中

<code>count( array_unique( str_split( $a ) ) ) == count( array_unique( str_split( $a.$b ) ) )</code>

判断一个字符串中的字符是否都在另一个中出现(算法)我怎么感觉这个不要去硬用循环吧比如楼上的$a = ‘aGasdjhyzxhjkASDqudhaTskjbFjlhicikgckzjhcjlasdyioyqweHyfhdspvuchvxcvnmaASDasydkasaSD’;$b = ‘asdhnbvdhaSlsdhFDasTdhjkaAFsdhagdmnasdbasgdkasjdjagDfjagfhgzfhghzxjcjkahdajsgdGSkahd’;这里好像是说判断 怎么搞成了查找?如果是判断 完全可以用 echo strreplace(strsplit($b),”,$a)==”?’都有’:’不是都有’;


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php 判断一个字符串中的字符是否都在另一个中出现(算法)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址