字符串

作者: cookyo | 来源:发表于2019-06-04 16:12 被阅读0次
1 最长无重复字符子串
class DistinctSubstring:
    def longestSubstring(self, A, n):
        # write code here
        dic = {}
        pre = -1
        length = 0
        maxlen = 0
        
        for i in range(n):
            if A[i] not in dic:
                length = i - pre
                dic[A[i]] = i
                maxlen = max(length, maxlen)
            else:
                if dic[A[i]] > pre:
                    length = i - dic[A[i]]
                    pre = dic[A[i]]
                else:
                    length = i - pre
                maxlen = max(length, maxlen)
                dic[A[i]] = i
        return maxlen
2 最长上升子序列(动态规划)
class LongestIncreasingSubsequence:
    def getLIS(self, A, n):
        # write code here
        dp = [0 for i in range(n)]
        dp[0] = 1
        for i in range(1,n):
            tmp = 0
            for j in range(i):
                if A[j] < A[i] and tmp < dp[j]:
                    tmp = dp[j]
                dp[i] = tmp+1
        return max(dp)
3 最长公共子序列的长度(动态规划)
class LCS:
    def findLCS(self, A, n, B, m):
        # write code here
        if A == None or B == None:
            return 0
        dp = [[0]*n for i in range(m)]
        
        if A[0] == B[0]:
            dp[0][0] = 1
        else:
            dp[0][0] = 0

            
        for i in range(1,n):
            if B[0] == A[i]:
                dp[0][i] == 1
            else:
                dp[0][i] == dp[0][i-1]
        for i in range(1,m):
            if A[0] == B[i]:
                dp[i][0] == 1
            else:
                dp[i][0] == dp[i-1][0]

                
        for i in range(1,m):
            for j in range(1,n):
                if A[j] == B[i]:
                    dp[i][j] = dp[i-1][j-1] + 1
                else:
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1])
        return dp[-1][-1]

4 对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串
class Parenthesis:
    def chkParenthesis(self, A, n):
        num = 0
        for i in A:
            if i == '(':
                num += 1
            if i == ')':
                num -= 1
            if num < 0:
                return False
        if num == 0:
            return True
        return False
5 找零钱
有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以
使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。

给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。

测试样例:
[1,2,4],3,3
返回:2 

class Exchange:
    def countWays(self, penny, n, aim):
        # write code here
        matrix = [[0 for i in range(aim+1)] for j in range(n)]
        for i in range(aim+1):
            if i % penny[0] == 0:
                matrix[0][i] = 1
            else:
                matrix[0][i] = 0
        for i in range(n):
            matrix[i][0] = 1
        for i in range(1,n):
            for j in range(1,aim+1):
                if j - penny[i] < 0:
                    matrix[i][j] = matrix[i-1][j]
                else:
                    matrix[i][j] = matrix[i-1][j] + matrix[i][j-penny[i]]
        return matrix[-1][-1]
6 01背包
一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录
在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的
总价值最大。

给定物品的重量w价值v及物品数n和承重cap。请返回最大总价值。

测试样例:
[1,2,3],[1,2,3],3,6
返回:6

class Backpack:
    def maxValue(self, w, v, n, cap):
        # write code here
        matrix = [[0]*(cap+1) for i in range(n)]
        for i in range(cap+1):
            if w[0] <= i:
                matrix[0][i] = v[0]
            else:
                matrix[0][i] = 0
        for j in range(n):
            matrix[j][0] = 0
        
        for i in range(1,n):
            for j in range(1,cap+1):
                if w[i] > j:
                    matrix[i][j] = matrix[i-1][j]
                else:
                    matrix[i][j] = max(matrix[i-1][j], matrix[i-1][j-w[i]] + v[i])
        return matrix[-1][-1]
7 最优编辑
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种
操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。

给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串
长度均小于等于300,且三种代价值均小于等于100。

测试样例:
"abc",3,"adc",3,5,3,100
返回:8

class MinCost:
    def findMinCost(self, A, n, B, m, c0, c1, c2):
        # write code here
        dp = [[0] * (n+1) for _ in range(m+1)]
        #dp = [[0 for j in range(m+1)] for i in range(n+1)]
        #dp[0][0] = 0
        for i in range(1,n+1):
            dp[0][i] = c1 * i
        for j in range(1,m+1):
            dp[j][0] = c0 * j
            
        for i in range(1,m+1):
            for j in range(1,n+1):
                if A[j-1] == B[i-1]:
                    dp[i][j] = dp[i-1][j-1]
                else:
                    dp[i][j] = min(dp[i-1][j]+c0, dp[i][j-1]+c1, dp[i-1][j-1]+c2)
        return dp[-1][-1]

相关文章

  • Javascript知识点整合

    字符串 单行字符串: ‘字符串’或“字符串” 多行字符串: `多行字符串` 字符串操作: 字符串连接‘+’号 长度...

  • C++基础字符串

    字符串的构造 字符串特性描述 字符操作 字符串赋值 字符串连接 字符串比较 字符串查找 字符串替换 字符串删除 字...

  • iOS中的NSString与NSMutableString

    字符串的创建 字符串读写 字符串的比较 字符串的搜索 字符串截取 字符串替换 字符串与路径 字符串转换 NSMut...

  • iOS NSString用法总结

    字符串属性 字符串截取 字符串比较 字符串搜索 字符串拼接 字符串基本类型转换 字符串分行,分段 字符串列举(按条...

  • php 字符串常见方法汇总

    字符串拼接 字符串检索 字符串截取 字符串替换 字符串大小写转化 字符串转数组 字符串格式化

  • iOS 字符串截取、iOS 字符串替换、iOS 字符串分隔、iO

    iOS之字符串截取、iOS 字符串替换、iOS字符串分隔、iOS之字符串匹配、截取字符串、匹配字符串、分隔字符串 ...

  • PHP中字符串函数库常用函数解析 -- PHP 学习 (十一)

    常用字符串函数分类: 字符串长度, 字符串查找, 字符串大小写转换, 字符串截取, 字符串 ASCII, 字符串加...

  • Kotlin语言(二):字符串类型

    1、字符串定义 2、字符串删除空格 3、字符串比较 4、字符串切割 5、字符串截取 6、字符串替换 7、字符串模板

  • 字符串扩展

    求字符串大小 字符串解码、转换 字符串截取 字符串汉字处理 字符串 Mac地址 字符串进制转换

  • 2020-09-30字符串

    day8-字符串 字符串的操作 in 和 not in字符串1 in 字符串2 - 判断字符串1是否是字符串...

网友评论

      本文标题:字符串

      本文链接:https://www.haomeiwen.com/subject/wmxrxctx.html