如何有效地查找数组的所有可能子数组?
答案 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
}