求字符串中最大的递增子序列

数据库环境:SQL SERVER 2005

如题,求字符串“abcbklmnodfghijkmer”中最大的递增子序列。这个字符串有点特别,

只由26个小写字母a-z组成。

大概思路如下:

1.将字符串转到一列存储,并生成行号

2.设置一个递增计数器列,默认为1,比较上下行的字符,如果在字典中的顺序是递增,

则计数器加1,否则,计数器置1

3.找出计数器最大的数及对应的行号,根据这2个数截取字符串

思路有了,下面直接贴代码

DECLARE @vtext VARCHAR(255)
SET @vtext = ‘abcbklmnodfghijkmer‘
/*讲字符串转成一列存储,并生成行号*/
WITH    x0
          AS ( SELECT   number AS id ,
                        SUBSTRING(@vtext, number, 1) AS letter
               FROM     master.dbo.spt_values
               WHERE    type = ‘P‘
                        AND number <= LEN(@vtext)
                        AND number >= 1
             ),/*实现计数器*/
        x1 ( id, letter, clen )
          AS ( SELECT   id ,
                        letter ,
                        1 AS clen
               FROM     x0
               WHERE    id = 1
               UNION ALL
               SELECT   x0.id ,
                        x0.letter ,
                        CASE WHEN x1.letter <= x0.letter THEN x1.clen + 1
                             ELSE 1
                        END AS clen
               FROM     x0 ,
                        x1
               WHERE    x0.id = x1.id + 1
             )
    /*截取字符串*/
    SELECT  SUBSTRING(@vtext, start, sublen) AS 最大子序列
    FROM    ( SELECT    id ,
                        clen ,
                        MAX(clen) OVER ( ) AS maxclen ,
                        id - MAX(clen) OVER ( ) + 1 AS start ,
                        MAX(clen) OVER ( ) AS sublen
              FROM      x1
            ) t
    WHERE   clen = maxclen

求出的最大子序列是

(本文完)

时间: 07-16

求字符串中最大的递增子序列的相关文章

求数组中最长递增子序列的长度

个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 怒冲北京,为理想前行. 题目 解法 使用工具栈单枝遍历数组(思路源于工具栈可以双枝遍历二叉树的方法) 栈里存放的是数组的下

编程之美5:求数组中最长递增子序列

最近楼楼被男朋友带着玩dota,有点上瘾,终于在昨天晚上作出了一个重大的决定,shift+delete删掉warIII文件夹,从此退出dota的明争暗斗.不过最近看男票已经将战场从11转到了topcoder,嗯,这是个好现象,希望楼楼也能跟着玩儿起来. 理想是美好的,唉,可是楼主还在编程之美的初级阶段啊.话不多说了,希望自己加油加油再加油!!(^o^)/~ 今天要看的一道题目是求数组中最长递增子序列. 题目简介: 写一个时间复杂度尽可能低的程序,求一个一维数组(N)个元素中的最长递增子序列的长度

[算法]求数组中最长递增子序列长度

思路: 1.开辟数组L,L[i]记录的为a[0]~a[i]的最长递增子序列长度 2.开辟数组maxV,maxV[i]记录的为长度为i的各递增子序列的最后一个元素的最小值,譬如有子序列 1,2,4 1,2,5 则maxV[3] = 4 3.使用maxLen记录当前的最长递增子序列长度 4.转移方程: L[i+1] = max{1,L[j]+1] , a[i] > maxV[j] && j <= maxLen int LIS(int* a, int n){ int* maxV =

求数组中最长递增子序列

编程之美有一道关于数组中最长递增子序列,题目如下: 写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例如在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列的长度为4(如1,2,4,6),从该书给的例子我们可以知道的是其最长的递增子序列可以不连续的. 作者利用动态规划方法给了三种解法. 解法一: 根据无后效性的定义,各阶段按照一定的次序排列好之后,对于某个给定阶段的状态来说,它以前各阶段的状态无法直接影响它未来的决策,而只能间接地通过当前状态来影

2.16 求数组中最长递增子序列

题目: 求一个一维数组(N个元素)中最长递增子序列的长度 DP题 代码如下: #include <iostream> using namespace std; const int MAXN = 100000; const int INF = 10000000; int minV[MAXN], lis[MAXN], Array[MAXN]; int n; //lis[i]表示从第i个元素开始的最长序列的长度 //minV[i]表示所有长度为i的序列中,最大的元素的最小值 //Array这个数组代

编程之美---求数组中最长递增子序列

写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 解法一:用动态规划,找出以当前元素结尾的最大递增子序列长度.dp[i+1] = max{1, dp[i]+1} ,array[i+1]>array[k] ,k<=i; 复杂度为o(n*n + n). 解法二:另外开一个数组保存长度为i的递增子序列的长度最大的最后一个元素最小的值,然后当处理数组中第i个元素时,从当前最大子序列的长度开始递减,依次寻找直到arrary[i]大于当前最大子序列长度的末尾元素值,然后更

【难】求数组中最长递增子序列,时间复杂度O(nlogn)

题目:<编程之美> P194 写一个时间复杂度尽可能低的程序,求一个数组(length个元素)中最长递增子序列的长度. 注意,本题认为最长递增子序列可以有相等的元素,如 (1,2,2,3,3,4,5,6). 时间复杂度为O(n^2)的程序思路很简单,参考书上的解法一.针对O(n^2)的解法进行改进,利用有序数组的二分查找,可以使得时间复杂度降低.本题的难点在于,建立一个长度为length+1的数组MinV,MinV[i]代表着长度为i的递增子序列最大元素的最小值.而且数组MinV是升序的,理解

HDU 3518 Boring counting(后缀数组啊 求字符串中不重叠的重复出现至少两次的子串的个数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3518 Problem Description 035 now faced a tough problem,his english teacher gives him a string,which consists with n lower case letter,he must figure out how many substrings appear at least twice,moreover

[2013百度软件研发笔试题] 求字符串中连续出现同样字符的最大值

题目完整描写叙述为:用递归的方式实现一个求字符串中连续出现同样字符的最大值.如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 下面是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\