比较两个数组并返回第一个外观的索引

时间:2016-06-16 04:34:11

标签: arrays time-complexity complexity-theory

我有一项任务要做,我正在考虑这个问题,但我没有想出正确的答案。

  

使用您选择的语言编写一个函数,该函数获取名为str的字符串和名为set的字符串。

     

该函数将返回str。

中设置的任何char的首次出现的索引      

例如:   str =“hellohellohellohelloistom!”   set =“t98765!”

     

该函数将返回22(str中的索引为'5')。   确保时间复杂度不大于两个字符串的长度 - O(m + n)   假设该字符串仅包含ASCII字符。

我正在考虑这个问题,并且考虑过分而治之。我有一个基本情况,总是O(1),我把问题分成较小的问题,直到我得到答案。问题是,使用该解决方案,复杂性将为O(log n)。

我认为另一个方法就是制作一套。但我仍然不知道如何解决这个问题。任何想法??

3 个答案:

答案 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. 如果找不到任何字符,则返回nil
  2. 是区分大小写的比较
  3. 希望这能解决您的问题。

答案 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还会报告setstr中的字符索引。如果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;
    }