找到许多字符串的公共前缀的最有效方法

时间:2012-06-18 01:27:11

标签: string algorithm prefix

找到许多字符串的公共前缀的最有效方法是什么。

例如:

对于这组字符串

/home/texai/www/app/application/cron/logCron.log
/home/texai/www/app/application/jobs/logCron.log
/home/texai/www/app/var/log/application.log
/home/texai/www/app/public/imagick.log
/home/texai/www/app/public/status.log

我想得到/home/texai/www/app/

我想通过char比较来避免char。

2 个答案:

答案 0 :(得分:2)

您无法避免至少查看公共部分以找到公共前缀。

我认为这不需要任何花哨的算法。只需跟踪当前的公共前缀,然后通过将当前前缀与下一个字符串进行比较来缩短前缀。

由于这是所有字符串的通用前缀,因此最终可能会出现空字符串(无公共前缀)。

答案 1 :(得分:1)

我不确定你的意思是避免char by char比较,但你至少需要从每个字符串中读取公共前缀,所以下面的算法是你能达到的最好的(只是迭代字符串直到它们偏离或直到达到当前最长的前缀计数为止:

List<string> list = new List<string>()
{
    "/home/texai/www/app/application/cron/logCron.log",
    "/home/texai/www/app/application/jobs/logCron.log",
    "/home/texai/www/app/var/log/application.log",
    "/home/texai/www/app/public/imagick.log",
    "/home/texai/www/app/public/status.log"
};

int maxPrefix = list[0].Length;
for(int i = 1; i < list.Count; i++)
{
    int pos = 0;
    for(; pos < maxPrefix && pos < list[i].Length && list[0][pos] == list[i][pos]; pos++);

    maxPrefix = pos;
}

//this is the common prefix
string prefix = list[0].Substring(0, maxPrefix);