华为机试题目-多最长子串筛选

问题描述和解决方案

package com.windit.model.algo;

import java.util.Scanner;

/**
 * 最长平台问题-衍生版
 * <p>
 *     问题描述:给定一个字符串,有字符连续出现,
 *     请寻找这些连续字符串中最长的字符串,如果最长的串有多个,
 *     请输出ascii最小的;
 *     解决方案:先按照“最长平台”模型,计算出最大长度,
 *     然后再次遍历字符串,寻找asc码值最大的的子串
 * </p>
 */
public class LongPlateau {
    
    
    public static void main(String[] args) {
    
    
        System.out.println("最长平台模型...");
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        findMaxStr(str);
        System.out.println("Game over ...");

    }

    public static void findMaxStr(String str){
    
    
        int len = str.length();
        int count = 1; //平台最大长度默认值
        char[] arr = str.toCharArray();
        for(int i=1; i<len; i++){
    
    
            if(arr[i] == arr[i-count]){
    
    //固定起点位置,i-count ; 变化尺子的长度:count++
                count++; //循环结束之后,便是最大平台的长度
            }
        }
        System.out.println("最大长度:"+ count);
        //如果多个相同长度的最大平台,选出ascii值最小的那个
        int minChar = 0;//最小的ASC值
        int index = 0; //初次出现的位置
        for(int j=0;j<len;j++){
    
    
            if(j+count > len){
    
    //接近越界,不需继续查找
                break;
            }
            if((arr[j] == arr[j+count-1]) && (minChar < (int)arr[j])){
    
    
                    index =j ;//找到起始位置
                    minChar = (int)arr[j]; //更新最小的ASCII码值
            }
        }
        //输出结果
        System.out.println("起始位置: " + index +",字符:" + minChar);
        String res = str.substring(index,index+count);
        System.out.println("目标平台是:" + res);
    }
}

最长平台问题--C语言名题百则

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200415112729989.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MDQwMTcz,size_16,color_FFFFFF,t_70#pic_center)

猜你喜欢

转载自blog.csdn.net/qq_37040173/article/details/105531100