poj1159(动态规划或者lcs求最长字串)

http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=20480

LCS求最长公共子串

#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<vector>
using namespace std;
short a[5005][5005];
char s1[5005];
char s2[5005];
int LCS(const char *s1, const char *s2)
{
    // s1:0...m, s2:0...n
    int m = strlen(s1), n = strlen(s2);
    int i, j;
    a[0][0] = 0;
    for( i=1; i <= m; ++i )
        a[i][0] = 0;
    for( i=1; i <= n; ++i )
        a[0][i] = 0;
    for( i=1; i <= m; ++i )
        for( j=1; j <= n; ++j )
        {
            if(s1[i-1]==s2[j-1])
                a[i][j] = a[i-1][j-1]+1;
            else if(a[i-1][j]>a[i][j-1])
                a[i][j]= a[i-1][j];
            else
                a[i][j] = a[i][j-1];
        }
    return a[m][n];
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        for(int i=0; i<n; i++)
        {
            cin>>s1[i];
        }
        for(int i=0; i<n; i++)
        {
            s2[i]=s1[n-i-1];
        }
        //cout<<s1<<" "<<s2<<endl;
        cout<<n-LCS(s1,s2)<<endl;
    }
}

动态规划 注意short类型,不然会超内存;

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
short dp[5001][5001];
int main()
{
    int k;
    char a[5001],b[5001];
    while(~scanf("%d",&k))
    {
        scanf("%s",a);
        int p=0;
        for(int i=k-1; i>=0; i--)
        {
            b[p]=a[i];
            p++;
        }
        //for(int i=0; i<k; i++)
           // printf("%c%c",b[i],(i==(k-1))?‘\n‘:‘ ‘);
        memset(dp,0,sizeof(0));
        for(int i=1; i<=k; i++)
            for(int j=1; j<=k; j++)
            {
                if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
                else
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
           // printf("%d\n",dp[k][k]);
        printf("%d\n",k-dp[k][k]);

    }
}

原文地址:https://www.cnblogs.com/RainzzZ/p/12067054.html

时间: 2024-08-01 19:56:55

poj1159(动态规划或者lcs求最长字串)的相关文章

LCS 求最长公共子序列

最长公共子序列不需要字符连续出现和字串不同 //LCS 求最长公共子串模板题  Common Subsequence 描述 A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is

九度1535 重叠的最长字串 字符串哈希

题目描述: 给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和"cdefg"是"cde",长度为3. 输入: 输入可能包含多个测试案例. 对于每个测试案例只有一行, 包含两个字符串.字符串长度不超过1000000,仅包含字符'a'-'z'. 输出: 对应每个测试案例,输出它们前后重叠的最长子串的长度. 样例输入: abcde cdefg 样例输出: 3 #include <iostream> #include <

编程练习:无重复字符的最长字串

题目LeetCode-无重复字符的最长字串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例1 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例2 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 分析与实现 解法一 分析 这里面的难度在于,从i开始遍历,遇到相同字符后结束,记录长度.然后从

leetcode Longest Common Prefix 多个字符串的最长字串

1 public class Solution { 2 public String get(String a,String b) 3 { 4 5 if(a==""||b=="") return ""; 6 int len1=a.length(); 7 int len2=b.length(); 8 int len=len1; 9 if(len>=len2) len=len2; 10 String s=""; 11 for(

leetcode无重复字符的最长字串 python实现

无重复字符的最长字串是一道字符串处理算法的题目,在日常编程中,处理字符串是常见任务.用Python来实现leetcode这道算法题,该题目会涉及到一个概念"滑动窗口". 一.题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度(Longest substring without repeating characters). 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所

无重复字符的最长字串问题

leetcode3:无重复字符的最长字串问题 问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3.示例 2: 输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1.示例 3: 输入: "pwwkew"输出: 3 这道题,我自己的

LCS求最长公共子序列(DP)

动态规划并不是一种算法,而是一种解决问题的思路.典型的动态规划问题,如最长公共子序列(LCS),最长单调子序列(LIS)等. 动态规划分为四个步骤: 1.判断问题是否具有最优子结构 这里以LCS为例,X={x1,x2,...,xi}:Y={y1,y2,...,yj}.最长公共子序列Z={z1,z2,...,zk}: ①如果xi=yj,那么zk=xi=yj,且Zk-1是序列Xi-1和Yj-1的LCS: ②如果xi≠yj,那么zk≠xi:且Zk是序列Xi-1和Yj的LCS: ③如果xi≠yj,那么z

poj2406 kmp 求最小循环字串

Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 47748   Accepted: 19902 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "

[leetcode]3无重复字符的最长字串

本题思路较清楚,通过一个数组记录各个位置所能够引导的最长字符串的长度即可. 稍微有一点难度在于如何向前寻找时判断已经出现了重复字符串,我采用的思路为只有当前项的长度等于当前长度时,认为尚未出现重复字符串,并更新前项长度++. 1 int max=0; 2 int st[100000]={0};//表示以它为开头的最长不重复字串长度 3 int i=0; 4 char p; 5 while(s[i]!='\0') 6 { 7 p=s[i]; 8 st[i]=1; 9 max=st[i]; 10 f