我想以特定的方式比较两个字符串。
字符串是由单词,运算符(" +" = AND," /" = OR)和括号组成的逻辑句子。 每个单词都可以是真或假。 句子没有特定的模式 - 可以给出单词和运算符的任何组合
我需要计算出返回true或false的函数,这取决于两个比较的句子是否相同。
让我评估几个例子:
示例1:
s1 = "A+B+C"
s2 = "A+B+C"
compare(s1, s2) 'will result True
示例2:
s1 = "A+B+C"
s2 = "A+C+B"
compare(s1, s2) 'will result True
示例3:
s1 = "(A/B)+C"
s2 = "A/B/C"
compare(s1, s2) 'will result False
示例4:
s1 = "(A/B)+C"
s2 = "A/(B+C)"
compare(s1, s2) 'will result False
示例5:
s1 = "(B/A)+(B/C)"
s2 = "(C/B)+(B/A)"
compare(s1, s2) 'will result True
示例6:
s1 = "A+B"
s2 = "A+W"
compare(s1, s2) 'will result False
示例7:
s1 = "A/B+C"
s2 = "A/(B+C)"
compare(s1, s2) 'will result False
例8:
s1 = "A/B+C"
s2 = "(A/B)+C"
compare(s1, s2) 'will result True
非常感谢任何提示
答案 0 :(得分:0)
我在比较功能中做了两步法。首先,我用一个数字替换每个单词。其次,我会评估公式,看看两个输入的结果是否相等。
部分伪代码:
Function compare(s1 As String, s2 As String) As Boolean
compare = parseAndEvaluate(s1) = parseAndEvaluate(s2)
End Function
Function parseAndEvaluate(str As String) As Long
' parse() needs to be implemented
For Each charOrWord in parse(str)
Select Case charOrWord
Case "+", "/", "(", ")":
parsedStr = parsedStr + charOrWord
Case Else:
' map() needs to be implemented
parsedStr = parsedStr + map(charOrWord)
End Select
Next
parseAndEvaluate = Application.Evaluate(parsedStr)
End Function
map()
函数也可以是某种字典,为新单词分配一个新数字(例如1024,2048,...),并将之前使用的单词映射到先前返回的数字。
parse()
函数将读入字符串并在字边界处拆分。
如果您的操作+
和/
比较困难,则需要稍微复杂一点的解析代码,将OR(..., ...)
或AND(..., ...)
写入传递给{的字符串中{1}}。