zoukankan      html  css  js  c++  java
  • 最短子序列(最短摘要)

    题目:有一段广告,它由很多单词构成,然后它有个摘要,即关键字,问包含摘要(关键字)的在广告正文中的最短字符串是什么?
             简而言之,就是说求在原字符串中包含所有关键字的最短子序列。
    算法思想:
                 将每个关键字在原字符串中位置记录在一个数组中,每个关键字对应一个数组,然后令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;
    }
    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
  • 原文地址:https://www.cnblogs.com/null00/p/2065071.html
Copyright © 2011-2022 走看看