首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算以子字符串开头的最大子字符串。

计算以子字符串开头的最大子字符串。
EN

Code Review用户
提问于 2016-03-05 16:24:26
回答 2查看 215关注 0票数 2

给定一个字符串和一个非空子字符串子字符串,递归计算最大的子字符串,该子字符串以sub开头和结尾,然后返回它的长度。

  • sub_sandwich("catcowcat", "cat")→9
  • sub_sandwich("catcowcat", "cow")→3
  • sub_sandwich("cccatcowcatxx", "cat")→9

我对我的代码不太满意,我也不知道如何改进它。

代码语言:javascript
复制
def subSandwich(word, char, pos, start, end):
    if pos == len(word)-1:
        if end == 0:
            return len(char)
        return end - (start-2)

    if word[pos:pos+len(char)] == char:
        if start != 0:
            end = pos + len(char) - 1
        else:
            start = pos+1

    return subSandwich(word, char, pos + 1, start, end)  

def main():
    print subSandwich("catcowcat", "cow",0,0,0)

if __name__ == "__main__":
    main()
EN

回答 2

Code Review用户

发布于 2016-04-09 01:19:33

为了简单起见,只使用2个参数修改子,在1循环时从两端减少1个字符。

代码语言:javascript
复制
#!/usr/bin/python
import unittest
import sys
import os

def subSandwich_new(word, char):
    num = word.count(char)
    if num ==0:
        return 0
    elif num ==1:
        return len(char)
    else:
        # first string with length of char
        first = word[:len(char)]

        match = 0
        if first == char:
            match = match + 1
        else:
            # remove 1 char from word
            word = word[1:]
        # string from end with the length of char
        last = word[-len(char):]
        if last == char:
            match = match + 1
        else:
            # removing 1 char from word
            word = word[:-1]
        if match ==2:
            # first and last both match
            return len(word)
        else:
            return subSandwich_new(word, char)

class SandwichTestNew(unittest.TestCase):
    def test_subSandwich_new(self):
        result = subSandwich_new('catcowcat', 'cat')
        self.assertEqual(result, 9)

    def test_subSandwich_new2(self):
        result = subSandwich_new('catcowcat', 'cow')
        self.assertEqual(result, 3)

    def test_subSandwich_new3(self):
        result = subSandwich_new('ccatcowcatxx', 'cat')
        self.assertEqual(result, 9)

    def test_subSandwich_new4(self):
        result = subSandwich_new('cat', 'cat')
        self.assertEqual(result, 3)

    def test_subSandwich_new5(self):
        result = subSandwich_new('cat', 'cow')
        self.assertEqual(result, 0)
票数 2
EN

Code Review用户

发布于 2016-04-09 12:09:05

不按特定顺序:

  • 如果沿着递归路线前进,为posstartend参数提供默认参数,比如: def subSandwich(word、char、pos=0、start=0、end=0),如果我想按原样使用它,我必须在第一个调用时提供0,0,0。这是向用户公开不必要的实现细节。
  • 如果找不到字符串,则返回搜索字符串的长度,例如:>>> subSandwich("catcowcat“、"fish") 4,最好是返回0(因为找不到匹配的字符串),或者引发一个适当的异常,说明”没有找到字符串“。
  • 风格问题:阅读PEP 8。特别是用于函数名的snake_case,以及逗号和运算符周围的空格。
  • 在代码中添加一些注释。现在还不清楚不同的变量意味着什么,所以我很难知道它应该做什么(而且扩展说,它是否做得对)。对于面向用户的函数,您应该始终有文档字符串。
  • 使用更好的变量名称:名称“char”听起来像是长度为1的字符串,而实际上可以是任意长度的字符串。您可以使用问题文本中建议的变量名: def sub_sandwidth(text,sub,pos=0,start=0,end=0) --注意,我在第一个参数中使用了“text”,而不是“string”,以避免与内置string模块混淆。
  • 您主要是改变pos参数,很少接触startend参数。一个更整洁的递归可能只需要在两个字符串之间传递,然后慢慢地削减text变量的大小,直到它匹配为止。这将允许您使用startswith()endswith()方法,而IMO则稍微整洁一些。下面是这样重写函数的方法: def sub_sandwich(文本,子):“”返回以sub开头和结尾的text最大子字符串的长度。如果sub不在text中,则返回0。“”#空字符串不能有任何子字符串,如果不是文本:返回0如果text.startswith(sub)和text.endswith( sub):返回len(text) elif text.startswith( sub):返回sub_sandwich(text*-1,sub),否则:返回sub_sandwich(text1:,sub)
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/121993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档