C++ 使用c+从由字符串组成的文件中查找所有可能的公共子字符串+;

C++ 使用c+从由字符串组成的文件中查找所有可能的公共子字符串+;,c++,string,file,C++,String,File,我试图从一个由不同长度的字符串组成的文件中找到所有可能的公共字符串。有人能帮我吗 例如,输入文件已排序: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG AAAAAAAATTAGGCTGGG AAAAAAAATTGAAACATCTATAGGTC AAAAA

我试图从一个由不同长度的字符串组成的文件中找到所有可能的公共字符串。有人能帮我吗

例如,输入文件已排序:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC    
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG
AAAAAAAATTAGGCTGGG
AAAAAAAATTGAAACATCTATAGGTC
AAAAAAACTCTACCTCTCT
AAAAAAACTCTACCTCTCTATACTAATCTCCCTACA
我想要的结果是:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC    
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG
AAAAAAAATTAGGCTGGG
AAAAAAAATTGAAACATCTATAGGTC
AAAAAAACTCTACCTCTCTATACTAATCTCCCTACA

[编辑]应删除作为任何其他行的子字符串的每一行。

我的理解是,您希望找到子字符串,并希望删除作为任何字符串的子字符串的字符串。 为此,您可以使用strstr方法来查找一个字符串是否是另一个字符串的子字符串。
希望这会有所帮助。

嗯,这可能不是解决问题的最快解决方案,但似乎很容易实现。您只需保留一个字符直方图,它将表示字符串的签名。对于您读取的每个字符串(以空格分隔),您计算每个字符的数量,如果没有任何其他字符串具有相同的每个字符数量,则将其存储在您的答案中。让我举例说明:

aaa bbb AAAB ab aaa

这里我们只有两个可能的输入字母,所以,我们只需要一个大小为2的直方图

  • aaa-历史[0]=3,历史[1]=0:新的-添加到答案中
  • bbb-hist[0]=0,hist[1]=3:新的-添加到答案中
  • aabb-hist[0]=2,hist[1]=2:新的-添加到答案中
  • ab-hist[0]=1,hist[1]=1:新的-添加到答案中
  • aaa-hist[0]=3,hist[1]=0:已存在!不要增加答案。

    实现的瓶颈将是直方图比较,有很多可能的实现

    最简单的方法是一个简单的线性搜索,遍历所有先前的答案,并与当前直方图进行比较,其中O(1)表示存储,O(n)表示搜索。如果你有一个大文件,完成它需要几个小时

    一个更快但更难实现的方法是使用哈希表存储答案,并使用直方图签名生成哈希代码。在这里解释这种方法会很麻烦


基本上,对于每一行,将其与下一行进行比较,以查看下一行是否较短,或者下一行的子字符串是否不等于当前行。如果这是真的,则该行是唯一的。这可以通过一个线性过程来完成,因为列表是经过排序的:任何包含条目子字符串的条目都将跟随该条目

非算法优化(微观优化)是为了避免使用substr创建新字符串。我们可以简单地比较另一个字符串,就好像它被截断了一样,而不实际创建被截断的字符串

vector<string> unique_lines;
for (unsigned int j=0; j < lines.size() - 2; ++j)
{
    const string& line = lines[j];
    const string& next_line = lines[j + 1];

    // If the line is not a substring of the next line,
    // add it to the list of unique lines.
    if (line.size() >= next_line.size() || 
        line != next_line.substr(0, line .size()))
        unique_lines.push_back(line);
}

// The last line is guaranteed to not be a substring of any
// previous line as the lines are sorted.
unique_lines.push_back(lines.back());

// The desired output will be contained in 'unique_lines'.
vector unique_行;
对于(无符号整数j=0;j=next_line.size()||
line!=下一行.substr(0,line.size())
独特的线。向后推(线);
}
//最后一行保证不是任何类型的子字符串
//行排序时的上一行。
唯一的_线。向后推(lines.back());
//所需输出将包含在“唯一_行”中。

好吧,我本来打算否决这个问题,但我只要求你对你的问题再详细说明一下。我花了一段时间才理解您的问题。您的输入字母是否仅限于T C G?我不明白为什么您希望的输出是这样的。所有输入之间唯一通用的子字符串是“aaaaaa”。你能再解释一下吗?你到底想知道什么?我们应该给你写一个程序吗?你是否完全不知道如何解决这个问题,并且想要一个算法?到目前为止,您尝试了什么(如果您尝试了什么的话)?看起来您想要放弃作为另一行前缀的所有行,对吗?我知道他想要删除任何重复的子字符串。这就是你想说的吗?正如Ashutosh所说,我试图删除任何字符串的字符串,谢谢大家,问题是标记C++,STD::String::找到一个更有用的答案。