【问题标题】:What is a shell command to find the longest common substring of two strings in unix?什么是在 unix 中查找两个字符串的最长公共子字符串的 shell 命令?
【发布时间】:2012-03-12 02:07:30
【问题描述】:

什么是在 unix 中查找两个字符串的最长公共子字符串的 shell 命令? 比如: foo 'abcdefghi' 'abjklmdefnop' 打印:def

【问题讨论】:

  • 这需要是 POSIX 吗?针对任何特定发行版?
  • 最好让它在大多数 linux 上工作
  • @user1081596:那么我建议在 perl 中实现它,因为它将安装在每个 linux 上,除非用户将其删除。
  • @user1081596 在这种情况下,为什么 Perl 会比 Ruby、Python 或任何其他脚本语言更好?

标签: linux string shell unix awk


【解决方案1】:

我不确定是否有一个命令可以为您完成这项工作,但以下 bash 脚本应该可以完成。

#!/bin/bash

word1="$1"
word2="$2"
if [ ${#word1} -lt ${#word2} ]
then
        word1="$2"
        word2="$1"
fi
for ((i=${#word2}; i>0; i--)); do
        for ((j=0; j<=${#word2}-i; j++)); do
                if [[ $word1 =~ ${word2:j:i} ]]
                then
                        echo ${word2:j:i}
                        exit
                fi
        done
done

将以上内容另存为文件 substr.sh 做 chmod +x substr.sh

pranithk @ ~
09:24:32 :) $ ./substr.sh 'abcdefghi' 'abcdeghi'
abcde

pranithk @ ~
09:24:33 :) $ ./substr.sh 'abcdefghi' 'abjklmdefnop'
def

【讨论】:

    【解决方案2】:

    这被称为最长公共子序列问题,有一些很好的算法可以解决这个问题。查看动态编程解决方案(如果你用谷歌搜索,你会发现大量的实现)。如果你真的想在算法层面理解这一点,请查看这个 MIT 讲座,

    http://videolectures.net/mit6046jf05_leiserson_lec15/

    【讨论】:

    • 感谢您提供这个不错的链接。但现在恐怕我只需要一个快速的标准命令行解决方案,我不介意它是否以 O(n^5) 复杂度实现。
    • @user1081596:你的输入会有多大?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多