从一串数字中求其最长不降或不升序列java

列1描述:

设有由n(1≤n≤200)n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)b(1)、b(2)、……、b(n)若存在i1<i2<i3<…<iei1<i2<i3<…<ie 且有b(i1)<=b(i2)<=…<=b(ie)b(i1)<=b(i2)<=…<=b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。

【输入样例】

14
13 7 9 16 38 24 37 18 44 19 21 22 63 15
import java.util.Scanner;

public class 求最长不下降序列 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int a[]=new int[100];
        int f[]=new int [100];
        for (int i=1;i<=n;i++){
            a[i]=scanner.nextInt();
        }
        for(int i = 1;i <= n;i++)//初始化数组dp【】,每个数字自身组成为一个递增序列
        {
            f[i]=1;
        }
        int ant=0;
        for (int i=2;i<=n;i++){//从第二个数开始
            for (int j=1;j<i;j++){//第i个数与i前面的数进行比较
                if(a[j]<a[i])//如果前面的数小于后面的第i个数
                    f[i]=Math.max(f[i],f[j]+1);//f[i]是选择前面的小的数的递增序列数加+1
                //选择f[i]与f[j]+1更大的是因为有可能f[j]是前面重复的数,重复的数字不计入其中
                //重复的数的有的递增序列数有有一般小于现在f【i】的数
                //比如前面有两个2
                
            }
            ant=Math.max(ant,f[i]);
        }

        for (int z=1;z<=n;z++){
            System.out.print(f[z]);
            System.out.print(" ");
        }
        System.out.println(" ");
        System.out.println(ant);

    }

}

递减的代码

    for (int i=2;i<=n;i++){//最后一个,作为比较数
        for (int j=1;j<i;j++){//遍历i前的所有数进行比较,j是被遍历的数
            if(a[i]<a[j]){//递减
                //前面的大于后面的
               down[i]= Math.max(down[i],down[j]+1);
               //down[i]是for(j)前面选出加的
                // down[j]+1是前一个数【j】的递减数
            }
          
        }
        
        max=Math.max(max,down[i]);//选择递减数列多的
    }

Java中,给定一个字符串数组,最长连续序列可以采用多种方法,这里提供一种思路,即利用HashSet来帮助查找连续的字符串序列。具体步骤如下: 1. 首先,将字符串数组转换为HashSet,这样可以在O(1)的时间复杂度内查找字符串是否存在于数组中。 2. 然后,遍历数组中的每个元素,对于每个元素,尝试找到以它开始的连续序列。 3. 对于每个元素,检查它的后继字符串是否存在于HashSet中,如果存在,则继续检查下一个后继字符串,同时记录当前序列的长度。 4. 更新最长连续序列的长度,并记录下对应的起始字符串。 5. 最后,根据最长序列的长度和起始字符串,构造出最长连续序列。 下面是一个实现该逻辑的Java代码示例: ```java import java.util.HashSet; import java.util.Set; public class LongestConsecutiveSequence { public static String longestConsecutiveSequence(String[] strings) { Set<String> stringSet = new HashSet<>(); // 将字符串数组转换为HashSet for (String str : strings) { stringSet.add(str); } String longestSequence = ""; int maxLength = 0; // 遍历数组,寻找最长连续序列 for (String str : strings) { // 检查是否为序列的起始元素 if (!stringSet.contains(str + "a")) { int currentLength = 1; String currentStr = str; // 构建序列 while (stringSet.contains(currentStr + "a")) { currentStr += "a"; currentLength++; } // 更新最长序列 if (currentLength > maxLength) { maxLength = currentLength; longestSequence = str; } } } // 根据最长序列的长度,构造出最长连续序列 StringBuilder longestStr = new StringBuilder(); for (int i = 0; i < maxLength; i++) { longestStr.append(longestSequence).append("a"); longestSequence = longestSequence.substring(0, longestSequence.length() - 1); } return longestStr.toString(); } public static void main(String[] args) { String[] strings = {"a", "ba", "bb", "ab", "abc"}; System.out.println("The longest consecutive sequence is: " + longestConsecutiveSequence(strings)); } } ``` 请注意,上述代码中的字符串连接操作`currentStr += "a"`和`longestStr.append(str).append("a")`用于模拟连续性的检查。在实际应用中,可能需要根据实际的连续性条件进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值