我有一项任务要做,我正在考虑这个问题,但我没有想出正确的答案。
使用您选择的语言编写一个函数,该函数获取名为str的字符串和名为set的字符串。
该函数将返回str。
中设置的任何char的首次出现的索引例如: str =“hellohellohellohelloistom!” set =“t98765!”
该函数将返回22(str中的索引为'5')。 确保时间复杂度不大于两个字符串的长度 - O(m + n) 假设该字符串仅包含ASCII字符。
我正在考虑这个问题,并且考虑过分而治之。我有一个基本情况,总是O(1),我把问题分成较小的问题,直到我得到答案。问题是,使用该解决方案,复杂性将为O(log n)。
我认为另一个方法就是制作一套。但我仍然不知道如何解决这个问题。任何想法??
答案 0 :(得分:2)
这个程序是用Swift编写的
let str = "hellohellohellohelloistom!"
let set = "t98765!"
func findFirstAppearance(str : String , set : String) -> Int? {
var index : Int?
mainLoop: for setCharacter in set.characters{
for (indexOfChar,strCharacter) in str.characters.enumerate(){
if strCharacter == setCharacter{
index = indexOfChar
break mainLoop
}
}
}
return index
}
print(findFirstAppearance(str, set: set))
print(findFirstAppearance("helloWorld", set: "546Wo"))
或其他耗时较少的解决方案
let str = "hellohellohellohelloistom!"
let set = "t98765!"
func findFirstAppearance(str : String , set : String) -> Int? {
var index : Int?
mainLoop: for setCharacter in set.characters{
if let range = str.rangeOfString(String(setCharacter)){
index = str.startIndex.distanceTo(range.startIndex)
break
}
}
return index
}
print(findFirstAppearance(str, set: set))
print(findFirstAppearance("helloWorld", set: "546Wo"))
注意:
希望这能解决您的问题。
答案 1 :(得分:1)
由于所涉及的所有字符串仅包含ASCII字符,因此使用constant memory
可以在O(LengthOf(str) + LengthOf(set))
中解决此问题。
以下是“C”语言中的代码:
//ReturnValues:
//-1 : if no occurrence of any character of set is found in str
//value >=0 : index of character in str.
int FindFirstOccurenceOfAnyCharacterInSet(const char *str, const char *set, int *index_of_set)
{
char hash[256];
int i = 0;
while(i < 256)
{
hash[i] = -1;
++i;
}
i = 0;
while(set[i] != '\0')
{
hash[set[i]] = i;
++i;
}
i = 0;
while(str[i] != '\0')
{
if(hash[str[i]] != -1)
{
*index_of_set = hash[str[i]];
return i;
}
++i;
}
*index_of_set = -1;
return -1;
}
逻辑的工作原理是记录set
表中hash
的所有字符的位置/索引(> = 0),然后解析str
并检查当前字符str
表格中存在hash
。
index_of_set
还会报告set
中str
中的字符索引。如果index_of_set = -1
则没有找到任何事件。
答案 2 :(得分:0)
感谢您的帮助!!
这也是C#中的代码。
干杯,
public static int FindFirstOccurenceOfAnyCharacterInSet(string str, string set)
{
var hash = new int[256];
int i = 0;
while (i < 256)
{
hash[i] = -1;
++i;
}
i = 0;
do
{
hash[set[i]] = i;
++i;
} while (set[i] != '\0' && i < set.Length - 1);
i = 0;
while (str[i] != '\0')
{
if (hash[str[i]] != -1)
{
return i;
}
++i;
}
return -1;
}