• 校招真题练习032 连续相同字符串(头条)


    连续相同字符串(编程题2)

    题目描述
    有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。

    输入描述:
    第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。

    输出描述:
    输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。

     1 def change(string,target,m,n):
     2     left = 0
     3     changelist = []
     4     changecount = 0
     5     maxlen = 0
     6     i,j = 0,0
     7     while i < n:
     8         if string[i] == target:
     9             i += 1
    10         else:
    11             if changecount < m:
    12                 changecount += 1
    13                 changelist.append(i)
    14                 i += 1
    15             else:
    16                 curleng = i - left
    17                 if curleng > maxlen:
    18                     maxlen = curleng
    19                 left = changelist[j] + 1
    20                 j += 1
    21                 changecount -= 1
    22     if len(changelist) > j:
    23         curleng = n - left
    24         if curleng > maxlen:
    25             maxlen = curleng
    26     return maxlen
    27 
    28 def main():
    29     ary1 = list(map(int,input().split()))
    30     n,m = ary1[0],ary1[1]
    31     string = input().strip()
    32     c1 = change(string,'b',m,n)
    33     c2 = change(string,'a',m,n)
    34     if c1 >= c2:
    35         print(c1)
    36     else:
    37         print(c2)
    38 
    39 if __name__ == '__main__':
    40     main()

    算法思路:双指针,滑动窗口。

    依据题意,需要尝试两种转换方式:1.将'a'转换为'b',2.将'b'转换为'a'。

    对于每一种转换,滑动窗口内部是完成m次转换的区域。当完成m次转换之后,计算当前区域的长度,并进行窗口的滑动。

  • 相关阅读:
    单据的多个状态字段
    Win7 如何阻止程序联网
    强制关机.bat
    Delphi Class of
    坐标转换 GetCursorPos与转换
    Delphi 的RTTI机制浅探-2
    Delphi 的RTTI机制浅探-1
    Delphi 的RTTI机制-3
    Delphi 的RTTI机制-2
    Delphi 的RTTI机制-1
  • 原文地址:https://www.cnblogs.com/asenyang/p/11319066.html
Copyright © 2020-2023  润新知