• 最短子序列(最短摘要)


    题目:有一段广告,它由很多单词构成,然后它有个摘要,即关键字,问包含摘要(关键字)的在广告正文中的最短字符串是什么?
             简而言之,就是说求在原字符串中包含所有关键字的最短子序列。
    算法思想:
                 将每个关键字在原字符串中位置记录在一个数组中,每个关键字对应一个数组,然后令distance = max(a[i], b[j], c[k]) - min(a[i], b[j], c[k]),然后最小的那个元素被它所在数组的下一个元素取代,依次循环下去。这里假设是三个关键字,然后就有三个数组。
    #include <iostream>
    using namespace std;

    int max(int a, int b, int c);
    int min(int a, int b, int c);

    int main()
    {
    const int LEN = 10;
    const int MAX = 100000000;
    char** str = new char*[LEN];
    str[
    0] = "My";
    str[
    1] = "name";
    str[
    2] = "is";
    str[
    3] = "wang";
    str[
    4] = "name";
    str[
    5] = "shuai";
    str[
    6] = "your";
    str[
    7] = "name";
    str[
    8] = "is";
    str[
    9] = "wang";

    char** keyword =new char*[3];
    keyword[
    0] = "wang";
    keyword[
    1] = "name";
    keyword[
    2] = "your";
    int a[LEN];
    int b[LEN];
    int c[LEN];
    for(int i = 0; i < LEN; i++)
    a[i]
    = b[i] = c[i] = -1;
    int j = 0;
    int k = 0;
    int l = 0;

    for(int m = 0; m < 3; m++)
    {
    for(int i = 0; i < LEN; i++)
    {
    if(strcmp(str[i], keyword[m]) == 0 && m == 0)
    a[j
    ++] = i;
    else if(strcmp(str[i], keyword[m]) == 0 && m == 1)
    b[k
    ++] = i;
    else if(strcmp(str[i], keyword[m]) == 0 && m == 2)
    c[l
    ++] = i;
    }
    }
    //相隔的最短距离
    int distance;
    //三个关键字的位置
    int postion1;
    int postion2;
    int postion3;

    //用于循环的三个变量
    int p = 0;
    int q = 0;
    int r = 0;


    int minium = MAX;
    while(a[p] >= 0 && b[q] >= 0 && c[r] >= 0)
    {
    distance
    = max(a[p], b[q], c[r]) - min(a[p], b[q], c[r]);
    if(distance < minium)
    {
    minium
    = distance;
    postion1
    = a[p];
    postion2
    = b[q];
    postion3
    = c[r];
    }
    if(min(a[p], b[q], c[r]) == a[p])
    p
    ++;
    else if(min(a[p], b[q], c[r]) == b[q])
    q
    ++;
    else if(min(a[p], b[q], c[r]) == c[r])
    r
    ++;
    }

    if(minium != MAX)
    {
    cout
    <<"长度为:"<<minium + 1<<endl;
    cout
    <<"从位置"<<min(postion1, postion2, postion3) + 1<<"到位置"<<max(postion1, postion2, postion3) + 1<<endl;
    }
    else
    cout
    <<"NO"<<endl;
    return 0;
    }

    int max(int a, int b, int c)
    {
    int max = a > b ? a : b;
    if(c > max)
    max
    = c;
    return max;
    }

    int min(int a, int b, int c)
    {
    int min = a < b ? a : b;
    if(c < min)
    min
    = c;
    return min;
    }
    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    数据表后缀问题
    window.history.go(-1)返回且刷新页面
    mysql性能优化-慢查询分析、优化索引和配置
    从数据库、代码和服务器对PHP网站Mysql做性能优化
    什么是WEBserver? 经常使用的WEBserver有哪些?
    浅谈 C/S 和 B/S 架构
    Android常用开源项目
    csdn android视频播放器开发
    视频会议十大开源项目排行
    Android开源项目大全
  • 原文地址:https://www.cnblogs.com/null00/p/2065071.html
Copyright © 2020-2023  润新知