【发布时间】:2016-12-05 10:55:06
【问题描述】:
假设给了我一个数组; A[] = {1,2,3} 我想找到这个数组的所有子数组。答案应该是
{1}
{1,2}
{1,2,3}
{2}
{2,3}
{3}
如何高效地找到一个数组所有可能的子数组?
【问题讨论】:
假设给了我一个数组; A[] = {1,2,3} 我想找到这个数组的所有子数组。答案应该是
{1}
{1,2}
{1,2,3}
{2}
{2,3}
{3}
如何高效地找到一个数组所有可能的子数组?
【问题讨论】:
我们可以使用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;
}
【讨论】:
数组 A 的子数组是 A[i..j] 其中0 <= i <= j < n 其中 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;
}
【讨论】:
O(n^3)。这是最有效的方法吗?我认为散列是一种更合适的方法,因为问题是找到子数组efficiently。
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);
}
}
【讨论】:
试试下面的代码:
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)
【讨论】:
在 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
}
【讨论】: