在Java中查找数组中的子数组

时间:2014-11-02 21:03:49

标签: java arrays

我正在尝试使用两种方法编写程序,以确定子数组是否位于数组中。 subArray()应该接收两个数组并返回数组中子数组的起始索引。如果子数组不在数组中,则返回-1。然后subArray()调用subArrayAppearsAt()并传入两个数组和一个位置。如果子数组位于从传入的位置开始的数组中,则subArrayAppearsAt()应返回true,否则返回false。 目前,如果我传入数组{1,2,3}和子数组{2,3},它返回2作为起始位置,但它应返回1。 如果我传入数组{1,2,3,4,5}和子数组{4},它返回-1,但它应返回3。 有谁知道为什么会发生这种情况?

        public static int subArray(int [ ] array, int [ ] subArray )
           {
            boolean result=true;
            int subArrayLength = subArray.length;

        if (subArrayLength == 0) {
            return -1;
        }

        int limit = array.length - subArrayLength;
        int i;
        for ( i = 0; i <= limit; i++)
            result = subArrayAppearsAt(array, subArray, i );

        if (result==true)
            return i;
        else
            return -1;

    }


    public static boolean subArrayAppearsAt(int[] largeArray, int[] subArray, int i) {

        {
            if (subArray[0] == largeArray[i]) 
            {
            boolean subArrayFound = true;

            for (int j = 1; j < subArray.length; j++) 
            {
                if (subArray[j] != largeArray[i+j]) 
                {
                    subArrayFound = false;
                    j=subArray.length;
                }

                /* Sub array found - return its index */
                if (subArrayFound==true) 
                {
                    return true;
                }
            }
        }
    }

    /* Return default value */
    return false;
}

3 个答案:

答案 0 :(得分:0)

问题是,如果你想知道起始位置,你应该把 if 检查结果在de 循环中

        public static int subArray(int [ ] array, int [ ] subArray )
           {
            boolean result=true;
            int subArrayLength = subArray.length;

        if (subArrayLength == 0) {
            return -1;
        }

        int limit = array.length - subArrayLength;
        int i;
        for ( i = 0; i <= limit; i++){
            result = subArrayAppearsAt(array, subArray, i );

            if (result==true)
              return i;
        }



            return -1;

    }

答案 1 :(得分:0)

看看这部分

for ( i = 0; i <= limit; i++)
    result = subArrayAppearsAt(array, subArray, i );

每次进入循环时都会设置结果。如果您在{4}中测试{1, 2, 3, 4, 5}是否被包含,则会将result设置为subArrayAppearsAt(array, subArray, 4);的返回值,这将返回false

因此,对于这个问题,您可以执行类似

的操作
for ( i = 0; i <= limit; i++) {
    result = subArrayAppearsAt(array, subArray, i );

    if (result==true)
        return i;
}
return -1;

另一个问题是,i在最后一次进入for循环后会递增,然后返回该值。我的代码解决方案也应该解决这个问题。

我没有测试我的解决方案,但它应该工作;)

修改

抱歉这不完全正确。您的subArrayAppearsAt()太早返回true。编辑您的subArrayAppearsAt()功能,它应该可以正常工作

public static boolean subArrayAppearsAt(int[] largeArray, int[] subArray, int i)
{
    if (subArray[0] == largeArray[i])
    {
        for (int j = 1; j < subArray.length; j++)
        {
            if (subArray[j] != largeArray[i+j])
            {
                return false;
            }
        }
        return true;
    }
    return false;
}

答案 2 :(得分:0)

public static void main(String[] args) {
    int[] first = {1,2,4,5,3,2,1,3,4,5,6,33,432,21,5};
    int[] second = {2,1};

    System.out.println(findpos(first, second));
}

private static int findpos(int[] a, int[] b){
    for(int i=0; i<a.length; i++){
        if(a[i]!=b[0]){
            continue;
        }
        if(a.length - i < b.length) return -1;

        int itemp = i;
        boolean found = true;
        for(int j=0; j<b.length; j++){
            if(itemp < a.length && a[itemp]!=b[j]){
                found = false;
            }
            itemp++;
        }
        if(found){
            return i;
        }
    }
    return -1;
}