我想检查字符串是否是另一个字符串的子集。但不是按顺序。
即“BAC”中的“ABC”=真。
到目前为止我所做的是按字母顺序对两个字符串进行排序(一旦在vba中完成运动),然后检查“find(a,b)”但这不是很有效:
“小时”不是“dffhioru”的子集,因为我找到了“小时”,但字母序列是hioru,而小时则是分类时的horu。
我理想地希望不在这里使用vba用于速度目的,但是如果没有这样的功能那么就这样吧。
答案 0 :(得分:1)
您可以在没有VBA的情况下执行此操作,方法是在单独的列中查找每个字母,然后在字符串长度与原始字符串匹配时加入它们。
在单元格E1中查找公式,然后自动填充到O?
=IFERROR(IF(FIND(MID($B2,E$1,1),$A2,1) > 0,MID($B2,E$1,1),""),"")
在C2中汇总公式并自动填充到单词列表的末尾。
=IF(COUNTA(E2:O2)-COUNTBLANK(E2:O2)=LEN(A2),CONCATENATE(E2,F2,G2,H2,I2,J2,K2,L2,M2,N2,O2),"")
答案 1 :(得分:0)
看看这个:
var list = cauldron.getElements();
foreach (Element remElem in a)
{
var elems = list.Where((e) => e.Id == remElem.Id);
if (elems.Any())
{
list.Remove(elems.ElementAt(0));
Debug.Log("Removed " + remElem + " from cauldron");
counter++;
}
}
它基本上做的是循环遍历第一个字符串中的每个字符(这里是单元格A1)并检查它是否在第二个字符串(单元格B1)中。如果未找到char,则代码停止,如果找到所有字符,则将“OK”置于单元格C1中。这应该让你去。
编辑:为了解决Storax的观点,我已经改变了一些代码。
首先它检查两个字符串的长度 - 如果第一个字符串自动更长,它不是一个子集。如果不是这种情况,它会将第二个字符串作为myText存储在内存中,并逐个取出字符。现在,如果可以取出所有字符,则意味着第一个字符串是一个子集,代码将“OK”放入单元格C1中。
Sub CheckString()
Dim myChar As String
Dim i As Long
Range("C1").Value = ""
For i = 1 To Len(Range("A1"))
myChar = Mid(Range("A1").Text, i, 1)
If InStr(1, Range("B1").Text, myChar, vbTextCompare) = 0 Then
Exit Sub
End If
Next i
Range("C1").Value = "OK"
End Sub