此函数应使用两个字符串“ daBcD”和“ ABC”。它试图从“ a”中的字母创建字符串“ b”。您只能删除或大写字母,不能更改它们。 b将始终包含所有大写字母。
def abbreviation(a, b)
aArray = a.split('')
idx = 0
aArray.each do |char|
#print "char: #{char}\n"
#print "Before loops: #{aArray}\n"
if char.casecmp(b[idx]) == 0
char.upcase!
idx += 1
#print "char: #{char}\nArry: #{aArray}\n"
#print "idx: #{idx}\n siz: #{b.size}\n"
if idx == b.size
aArray.reject! {|i| i == 'delete'}
aArray.slice!(b.size)
break
end
else
aArray[aArray.index(char)] = 'delete'
#print "deleted, now is: #{aArray}\n"
end
end
res = aArray.join('')
if res == b
return 'YES'
else
return 'NO'
end
end
这适用于几个测试用例,但大多数失败。有人可以描述更好的方法吗?
答案 0 :(得分:1)
我假设问题在于确定>Python 2.7.14 |Anaconda, Inc.| (default, Nov 8 2017, 13:40:45) [MSC v.1500
64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.
>File "C:/Users/hpinko/Desktop/python scripts/game.py", line 1, in <module>
import pygame
ImportError: No module named pygame
中的字符是否以与b
中相同的顺序出现在a
中(大小写无关),但不一定在{ {1}}(请参见下面的第二个示例)。如果有,我将返回它们在b
中出现的索引数组。如果没有匹配项,则返回a
。
a
对于第一个示例,正则表达式如下。
nil
答案 1 :(得分:0)
绝对简单的方法是通过正则表达式:
def abbreviation(a, b)
re = Regexp.new(b.each_char.map(&Regexp.method(:quote)).join('.*'), Regexp::IGNORECASE)
!!re.match(a)
end
abbreviation("daBcD", "ABC")
# => true
abbreviation("daCbD", "ABC")
# => false
对于输入ABC
,我们将构造一个正则表达式/A.*B.*C/i
,然后针对它测试另一个字符串。 .*
构造将说明“删除”; IGNORECASE
选项用于“大写”。
编辑:如果问题进一步受到限制,如注释所建议,只能删除小写字母,
def abbreviation(a, b)
# (b is uppercase only)
re_pat = b.each_char.map { |c| "[#{c}#{c.downcase}]"}.join('[[:lower:]]*')
re = Regexp.new(re_pat)
!!re.match(a)
end
p abbreviation("daBcD", "ABC") # => true
p abbreviation("daBdcD", "ABC") # => true
p abbreviation("daBDcD", "ABC") # => false