【问题标题】:Find common chars in array of strings, in the right order以正确的顺序在字符串数组中查找常见字符
【发布时间】:2010-01-29 10:23:38
【问题描述】:

我花了几天时间研究一个函数,以正确的顺序获取字符串数组中的常见字符,以创建通配符。

这是一个解释我的问题的例子。我做了大约3个函数,但是当每个字母的绝对位置不同时,我总是有一个错误。

假设“+”是“通配符”:

Array(
0 => '48ca135e0$5',
1 => 'b8ca136a0$5',
2 => 'c48ca13730$5',
3 => '48ca137a0$5');

应该返回:

$wildcard='+8ca13+0$5';

在本例中,棘手的是$array[2] 比其他字符多 1 个字符。

其他例子:

Array(
0 => "case1b25.occHH&FmM",
1 => "case11b25.occHH&FmM",
2 => "case12b25.occHH&FmM",
3 => "case20b25.occHH&FmM1");

应该返回:

$wildcard='case+b25.occHH&FmM+';

在这个例子中,棘手的部分是:
- 重复字符,例如“要删除”部分中的 1 -> 11,公共部分中的 c -> cc
- "to delete" 部分中 $array[2] & [3] 中的 "2" 字符不在同一位置
- 最后一个字符串末尾的“1”字符

我真的需要帮助,因为我找不到此功能的解决方案,它是我应用程序的主要部分。

先谢谢了,不要犹豫,问问题,我会尽快回答。

米克尔

【问题讨论】:

  • 它不会杀了你,所以没必要大声喊叫 ;-)
  • 嗯,好的……这是用于“HEEELLPPP”的编辑部分:)……它不会杀了我,是的,但我真的,真的,需要让它工作……
  • 很高兴你改变了它!现在阅读更好了:-)

标签: php string wildcard


【解决方案1】:

您似乎想从一组示例字符串中创建类似正则表达式的东西。 一般来说,这可能是相当棘手的。找到这个链接,不确定它是否相关: http://scholar.google.com/scholar?hl=en&rlz=1B3GGGL_enEE351EE351&q=%22regular%20expression%20by%20example%22&oq=&um=1&ie=UTF-8&sa=N&tab=ws

另一方面,如果您只需要一个特定的通配符,意思是“0 个或多个字符”,那么它应该会容易得多。 Levenshtein distance 算法计算两个字符串之间的相似度。通常只需要结果,但在您的情况下,差异的地方很重要。您还需要针对 N 个字符串进行调整。

所以我建议你研究一下这个算法,希望你能得到一些解决问题的想法(至少你会得到一些文本算法和动态编程的练习)。

PHP中的Heres算法: _http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#PHP

您可能还想搜索“diff”的 PHP 实现。 http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

【讨论】:

  • 你好,谢谢你的遮阳篷,但是:-我不认为我可以使用正则表达式,因为我不知道字符串中的字符类型,也不能知道我必须删除的类型 od 字符 - 我读了关于 Levenshtein 距离,但它告诉“差异的数量”,而不是差异是什么......并且没有顺序。 - 最后一个链接显示了一个不再起作用的 PHP 文件下载链接,并且 cmets 仅提供部分脚本。我真的需要保留常见的字符和顺序。
【解决方案2】:

主要代码:
第 1 步:将字符串按长度排序,从最短到最长,放入数组 []
第二步:比较数组[0]和数组[1]中的字符串得到$temp_wildcard
第 3 步:将数组 [2] 中的字符串与 $temp_wildcard 进行比较以创建新的 $temp_wildcard
第 4 步:继续将每个字符串与 $temp_wildcard 进行比较 - 最后一个 $wildcard 是您的 $temp_wildcard

好的,现在我们要解决如何比较两个字符串以返回通配符字符串的问题。

子程序代码: 逐个字符比较字符串,当比较不匹配时,将通配符替换为您的返回值。

要处理不同长度的问题,请为每个字符运行此比较额外的时间,以使第二个字符串更长并带有偏移量。 (比较 string1[x] 和 string2[x+offset]。)对于每个返回的字符串,计算通配符的数量。子例程应返回具有最少通配符的答案。

祝你好运!

【讨论】:

  • 您好,感谢您的遮阳篷!这是一个很好的算法,我想我今晚会试试。还有 1 种情况我无法匹配: Array("abcd", "bcde"); => 长度相同,但我应该得到“+bcd+”。它仍然是一个非常好的算法,比我的要好。米克尔
猜你喜欢
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2019-07-16
  • 2011-02-03
  • 2022-01-25
  • 2021-12-28
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多