如何有效地查找数组的所有可能的子数组?

时间:2016-12-05 10:55:06

标签: data-structures

如何有效地查找数组的所有可能子数组?

6 个答案:

答案 0 :(得分:3)

数组A的子数组是A [i..j],其中i <= j,i和j在(0..n-1)中,其中n是数组的长度。

在C语言中可以像这样计算

#include <stdio.h>

int main(){
    int A[] = {1,2,3,4,5};
    int len=sizeof(A)/sizeof(int);
    for( int i=0; i<len; i++ ){
        for( int j=i; j<len; j++ ){   // Now A[i..j] is the subarray
            for( int k=i; k<=j; k++ )
                printf("%d ", A[k]);
            printf("\n");
        }
    }
    return 0;
}

答案 1 :(得分:2)

我们可以使用substr函数来查找所有可能的子数组。

代码段:

       #include<bits/stdc++.h>
       using namespace std;


       void generateSubstring(string str)
       {
            if(str.size()==0)
            {
                return;
            }
            else
            {
                for(int i=0; i<str.size(); i++)
                {
                    for(int j=1; j<=str.size()-i; j++)
                    {
                        cout<<str.substr(i, i+j)<<endl;
                    }
                }
            }
        }


        int main()
        {
            ios::sync_with_stdio(false);
            string str;
            getline(cin, str);
            generateSubstring(str);
            return 0;
        }

答案 2 :(得分:2)

尝试以下代码:

def subarray(a, n) :
      for i in range(0,n):
             for j in range(i, n) :
                   for k in range(i, j+1) :
                          print(a(k), end=" ")
                   print("\n", end=" ")
a=[1, 2,3,4,5]
n=len(a)
print( all non - empty subarrays are:-)
subarray(a, n) 

答案 3 :(得分:1)

拿第一个元素。你有第一个子阵列。你有第二个元素吗?再加上那个,那里你有第二个。如果有第三个添加那个,依此类推。我们这样做,直到我们有最终的子阵列,从技术上讲,这是一个大小为n的整个数组。但现在我们回到两个位置,并跳过n-1元素,你确实添加了第n个元素......你得到一个新的子阵列。

请注意这涉及如何包含一些元素但跳过其他元素。猜猜看,递归正是你所需要的。逐步构建,在元素被使用后跳过元素(还有其他元素可供使用)。

<强>伪代码:

Array x;
collection SubArrays= {0}
SubArrays.AddSubArrays(x,0);

collection AddSubArrays(array, init,next){
 if(next>array.limit){
  return {0};
 }
 collection c.Add(array[init]
 while return not {0}
 i=init+1;
 while return not {0}
 c.AddSubArrays(array,init+1,i)
 i= i+1
 endwhile
 return c
}

答案 4 :(得分:1)

一种O(n ^ 2)方法可能是:

for (int i = 0; i < arr.length; i++) {
    String res = "";
        for (int j = i; j < arr.length; j++) {
            res += arr[j] + " ";
                System.out.println(res);
    }
}

答案 5 :(得分:0)

在JavaScript中

function subarray(arr){
  let sub = []
  for(let i=0;i<=arr.length-1;i++){
    for(let j=arr.length-1;j>=i;j--){
      sub.push(arr.slice(i,j+1))
    }
  }
  return sub
}