zoukankan      html  css  js  c++  java
  • 北京望京SOHO-电商墨镜面试题

    我去面试,boos 给出了个。动态规划的题目:

    ‘’‘’‘’

    A = "asdf"
    B = "axazxcv"
    
    S = "axasazdxfcv"

    字符串A 和 字符串B A 和 B 拆散组合成 S。 但是相对位置上不能变。
    判断 S 这个字符串,是否是由 AB 组成并且 相对位置不变, 如果是 返回Ture 否则False

    ##注:A串 和 B串。 是有重复的的字符的。 暂且忽略特殊字符的问题。
    例:
      A = "asdf"
      B = "axazxcv"
      S = "axasazdxfcv"
      return Ture
      =============================================
      A = "asdf"
      B = "axazxcv"
      S = "xaasazdxfcv"

      return False

    初一判断 我当时的想法完全是错的。  以下的是回家的路上想到的。

    1. 因为重复的问题,所以就不能单单的只靠 一个字符单纯的判断, S串中的某一个字符, 是属于A的还是属于B的。

    2. 所以一定是 S 的当前,某一个字符时,要判断一下 他前面的那个字符,是A的还是B的。

    可以这样去理解:

    A 表示为 A[0:i]      B 表示为 B[0:j]

    S[0:i+j]   ==   A[0:i] + B[0:j] 的组合   ##(这里不是字符串拼接,)

    然后状态的转移公式:  f(i,j) = (f(i-1,j) and A[i-1]==c[i+j-1]) or f(i,j-1) and B[i-1]==S[i+j-1])

    A = "asdf"
    B = "axazxcv"
    
    S = "axasazdxfcv"
    
    def static(A, B, S):
        if len(A+B) != len(S):  # 首先判断 两个的长度,是否相同。
            return False
        a = len(A)+1
        b = len(B)+1
       # 初始化二维列表。
    li = [[[] for _ in range(a)] for _ in range(b)] li[0][0] = True for i in range(1, a): li[0][i] = li[0][i-1] and A[i-1] == S[i-1] for j in range(1, b): li[j][0] = li[j-1][0] and B[j-1] == S[j-1]
      # 以上两部做的事情 可以看下面的图:   # 这里才是开始计算
    for i in range(1, a): for j in range(1, b): li[j][i] = (li[j][i-1] and A[i-1] == S[i+j-1]) or (li[j-1][i] and B[j-1] == S[i+j-1]) for n in li: print(n) return li[j][i]

    以下是 运行的结果。

    
    
    print(static(A, B, S))

    [True, True, False, False, False] [True, False, False, False, False] [True, True, True, False, False] [True, False, True, False, False] [False, False, True, True, False] [False, False, False, True, True] [False, False, False, False, True] [False, False, False, False, True] True
               a      s     d      f   
      [True, True, False, False, False] a [True, [], [], [], []] x [True, [], [], [], []] a [True, [], [], [], []] z [False, [], [], [], []] x [False, [], [], [], []] c [False, [], [], [], []] v [False, [], [], [], []]

    # 这里就是判断出S这个字符串的 前A的长度位上,于A有几个相同,显示在 第一行。
    # 前B 长度上,与B有几个相同。 显示在一列上。
    # 通过这个 应该就能看出, S这个字符串第一个位置上的字符, 是和 A 相同还是 B相同。 我的例子上,是两个都相同

    然后接下来就是 不好理解的地方了。
    从 S 这个字符串第二个索引的位置开始,判断一下这个位置上的字符,是来自A[0-i]的某一个,还是来自B[0-j]的某一个。并且要与前一个字符进行比较。
    比如:
      S的第二个字符x 他是属于B这个串的,B这个串中 a 字符的位置是在,数组中li[j][i-1]的这一行中。所以 A[i-1] == li[j][i-1] or B[j-1] == li[j-1][i] 返回的就使false
      但是 如果是 以下这种情况呢?
        A = "nsdf"
        B = "axazxcv"
        S = "anxsazdxfcv"

      S的第二个字符n 他是属于A这个串的,A这个串中 n 字符的位置是在,数组中li[j][i-1]的这一行中。所以 A[i-1] == li[j][i-1] or B[j-1] == li[j-1][i] 返回的就使Ture
    A[i-1] == li[j][i-1] 判断 S 的当前某个字符, 和这个字符的前一个字符是不是 属于A这个字符串的。
    B[j-1] == li[j-1][i] 判断 S 的当前某个字符, 和这个字符的前一个字符是不是 属于B这个字符串的。


    问题的关键就是,把他理解成, 将 A 这个字符串拆散,然后随机的插入到了 B这个串的某一个位置上。
    然后 我们循环 去确定S这个串上的每一个字符, 与 A或者B 对应位置上的某个字符相等。再加上与前面结果的 比较。 只有前面的是 Ture的情况下,S的当前
    的某个字符,才能够是Ture。 否则就是 False。

    这样 一级一级的判断下去,到最后一个的时候,如何使Ture 那个整个字符串就是 匹配的, 否则就是不匹配。

    我也不知道解释的是不是到位, 如果那位大佬心情好的话,看到了这个解释。 请跟我讲一讲其中的原委。 感激不尽。

  • 相关阅读:
    1.1 js 预解释(变量的提升,浏览器的加载机制)
    js 原型链详解
    ES6模块 与 CommonJS的差异
    export,import,export default,import()区别
    css权重优先级
    CSS3如何实现0.5边框
    JS 时间戳转换成具体时间
    http协议(二)请求和响应报文的构成
    http协议(一)一些基础知识
    mac homebrew  常用命令
  • 原文地址:https://www.cnblogs.com/chengege/p/10976399.html
Copyright © 2011-2022 走看看