如何查看数组是否包含另一个?

时间:2014-12-06 21:19:39

标签: java

问题:检查数组arr2是否以相同的顺序包含在arr1中。 arr2可以包含在arr1中的任何位置。

示例:

contains({"1", "2", "3"}, {"1", "2"}) → true
contains({"1", "2", "3"}, {"2", "3"}) → true
contains({"1", "2", "3"}, {"2", "1"}) → false

我的代码适用于所有情况,除非arr2比arr1短,而arr2不在arr1的第0位开始。

这是我的代码:

public boolean contains(String[] arr1, String[] arr2){
if (arr2.length>arr1.length)
{
   return false;
}

int x=0;
if(arr2.length==arr1.length)
{
   for (int i=0; i<arr1.length; i++)
   {
      if(arr1[i]==arr2[i])
      {
         x++;
      }
   }
   if(x==arr1.length)
   {
      return true;
   }
   return false;
}

int y=0;

if(arr2.length<arr1.length)
{
   for(int i=0; i<arr2.length; i++)
   {
      if(arr1[i]==arr2[i])
      {
         y++;
      }
   }
}
if(y==arr2.length)
{
   return true;
}
  return false;
}

我宁愿有提示而不是答案本身。非常感谢你!

4 个答案:

答案 0 :(得分:1)

您只想提示,所以这里有一个:

if(arr2.length<arr1.length)声明中,您只是循环比较arr1[i]arr2[i]。正如你自己所说,这只是比较arr2是否与arr1的开头匹配。

要测试arr2在稍后位置开始的情况,你必须在arr1 [i + j]和arr2 [i]之间对不同的j进行比较,即你需要另一个 for循环可能&#34;轮班&#34; j在数组起点之间,for i循环中的for j循环嵌套。务必在正确的位置将y重置为零。

答案 1 :(得分:1)

这是您的代码修改为正确的解决方案。你当然可以做得更好。

public boolean contains(String[] arr1, String[] arr2){
if (arr2.length>arr1.length)
{
   return false;
}

if(arr2.length==arr1.length)
{
   for (int i=0; i<arr1.length; i++)
   {
      if(!arr1[i].equals(arr2[i]))
      {
         retrun false;
      }
   }
return true;
}

int y =0; 

if(arr2.length<arr1.length)
{
   for(int i=0; i<=(arr1.length-arr2.length); i++)
   {
      for(int j=0; j<arr2.length;j++){
          if(arr1[i+j].equals(arr2[j])){
              y++;
          }
      }
       if(y == arr2.length){
           return true;
       }else {
         y = 0;
        }
   }
   return false;
}

答案 2 :(得分:0)

我建议查看String#contains方法实现(特别是在String #indexOf静态方法)。算法看起来与您的问题非常相似。

答案 3 :(得分:0)

在阅读您的解决方案时,我发现有3个部分。

第1部分:如果数组2小于数组1,则数组2不能是数组1的子数组

第2部分:比较2个数组的大小相同时的每个元素。如果所有元素都相同,则数组2是数组1的子数组

第3部分:当数组2的大小小于数组1的大小时,比较2数组的每个元素。 第2部分和第3部分存在问题。它们具有相同的逻辑。如果2个数组具有相同的大小,则第3部分工作正常。实际上,如果两个阵列具有相同的大小,那么第2部分将处理这种情况。所以第2步和第3步基本相同

我会修改第3部分如下:

第3部分(新):如果数组2小于数组1,并且数组2包含在数组1中,则数组1应该有一个子数组,其中该子数组的每个元素等于每个元素数组2

步骤1:将数组2的每个元素与数组1的子数组进行比较。

步骤2:如果所有元素都是等号,则数组2包含在数组1中。如果任何元素不相等,则对数组1的下一个子数组重复步骤1.

注意:如果您熟悉递归,解决方案将更整洁。每当我们重复步骤1时,我们正在解决同一问题,作为一般解决方案的一部分。

以下是递归解决方案。此解决方案不考虑null和空数组。

<!DOCTYPE html>
<html>
<body>

<p>This example calls a function which performs a calculation, and returns the result:</p>

<p id="demo"></p>

<script>

function findSubArray(bigArray, smallArray, startIndexOfSubArray)
{   
    if((bigArray.length - startIndexOfSubArray) < smallArray.length)
        return false;
    for(index = 0; index < smallArray.length; index++)
    {
        if(bigArray[startIndexOfSubArray + index] != smallArray[index]){
            return findSubArray(bigArray,
                                smallArray,
                                startIndexOfSubArray = startIndexOfSubArray + 1);           
        }           
    }

    return true;

}

var bigArray = [1,3,3,4,5,6];
var smallArray = [4,5,7];

var isSubArray = findSubArray(bigArray, smallArray, 0);

document.getElementById("demo").innerHTML = isSubArray.toString();
</script>

</body>
</html>