首页 > 试题广场 >

最长对称子字符串

[编程题]最长对称子字符串
  • 热度指数:5321 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个字符串(数字或大小写字母), 找出最长的对称的子串(如有多个,输出任意一个)。
例如:
输入:“abbaad”
输出:“abba”

输入描述:
字符串


输出描述:
字符串
示例1

输入

a1223a

输出

22
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        char[] carr = sc.nextLine().toCharArray();
        
        
        char[] carr2 =new char[carr.length];
        int[][] dp=new int[carr.length][carr.length];
        int i;
        
        if(carr.length==1){
            
            System.out.print(carr[0]);
            return;
        }
        
        
        for(i=0;i<carr.length;i++) {
            carr2[i]=carr[carr.length-i-1];
            
        
            
        }
        
        for(i=0;i<carr.length;i++) {
            
            if(carr[i]==carr2[0]) {
                
                
                dp[0][i]=1;
            }
            
            
            
            
            
        }
        
    for(i=0;i<carr.length;i++) {
            
            if(carr[0]==carr2[i]) {
                
                
                dp[i][0]=1;
            }
            
            
            
            
            
        }
    
    int j;
    int max=0;
    int end = 0;
    for(i=1;i<carr.length;i++) {
        
        for(j=1;j<carr.length;j++) {
            
            if(carr2[i]==carr[j]) {
                
                
                dp[i][j]=dp[i-1][j-1]+1;
                
                if(max<dp[i][j]) {
                    
                    max=dp[i][j];
                    
                    end=j;
                    
                }
                
                
                
            }
            
            
            
            
            
            
            
        }
        
        
        
        
        
        
    }
    
    
    
        
        
        
//        
//    for(i=0;i<carr.length;i++)
//        System.out.println(Arrays.toString(dp[i]));

    for(i=end-max+1;i<=end;i++) {
        
        System.out.print(carr[i]);
    }
    
    }
    

        

    
    
    
}
发表于 2020-06-06 18:57:11 回复(0)

因为给定一个字符串,只含数字或大小写字母,可以在每相邻字符之间添加'*',就不用分aba和abba两种情况了。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        // 在每相邻两个字符之间添加‘*’
        str = str.replaceAll(".", "*$0").substring(1);
        int maxArea = 0, maxIndex = 0;
        for (int i = 0; i < str.length(); i++) {
            int temp = getArea(str, i);
            if (temp > maxArea) {
                maxArea = temp;
                maxIndex = i;
            }
        }
        System.out.println(str.substring(maxIndex - maxArea, maxIndex + maxArea + 1).replace("*", ""));
    }

    private static int getArea(String str, int index) {
        int area = 0;
        int left = index - 1, right = index + 1;
        while (left >= 0 && right <= str.length() - 1) {
            // 向左右两边扩展
            if (str.charAt(left--) == str.charAt(right++)) {
                area++;
            } else {
                break;
            }
        }
        return area;
    }
}
编辑于 2019-07-08 11:07:23 回复(0)
import java.util.Scanner; public class Main{     public static void main(String args[]) {         Scanner scanner = new Scanner(System.in);         String input = scanner.nextLine();         String symmetryPart = getSymmetryString(input);         System.out.println(symmetryPart);     }     // 有两种对称     // 一种(way1str):baab式;     // 一种(way2str):bab式;     public static String getSymmetryString(String str) {         String way1str = getSymmetryStringWay1(str);         String way2str = getSymmetryStringWay2(str);         // 谁长选谁         return (way1str.length() > way2str.length()) ? way1str : way2str;     }     // bab式;     public static String getSymmetryStringWay2(String str) {         char[] chars = str.toCharArray();         int repeatTime = 0;         int centerIndex = 0;         for (int i = 0; i < chars.length - 2; i++) {             if (chars[i] == chars[i + 2]) {                 int repeatTemp = getSymmetryQuantityWay2(chars, i + 1);                 if (repeatTemp > repeatTime) {                     repeatTime = repeatTemp;                     centerIndex = i + 1;                 }             }         }         return str.substring(centerIndex - (repeatTime - 1) / 2, centerIndex                 + (repeatTime - 1) / 2 + 1);     }     // baab式;     public static String getSymmetryStringWay1(String str) {         char[] chars = str.toCharArray();         int repeatTime = 0;         int repeatIndex = 0;         for (int i = 0; i < chars.length - 1; i++) {             if (chars[i] == chars[i + 1]) {                 int repeatTemp = getSymmetryQuantityWay1(chars, i);                 if (repeatTemp > repeatTime) {                     repeatTime = repeatTemp;                     repeatIndex = i;                 }             }         }         return str.substring(repeatIndex - repeatTime / 2 + 1, repeatIndex                 + repeatTime / 2 + 1);     }     // bab式;     private static int getSymmetryQuantityWay2(char[] chars, int i) {         int repeat = 1;         int indexLeft = i - 1;         int indexRight = i + 1;         while (chars[indexLeft] == chars[indexRight]) {             indexLeft--;             indexRight++;             repeat += 2;             if (indexLeft < 0 || indexRight > chars.length - 1) {                 return repeat;             }         }         return repeat;     }     // baab式;     private static int getSymmetryQuantityWay1(char[] chars, int i) {         int repeat = 0;         int indexLeft = i;         int indexRight = i + 1;         while (chars[indexLeft] == chars[indexRight]) {             indexLeft--;             indexRight++;             repeat += 2;             if (indexLeft < 0 || indexRight > chars.length - 1) {                 return repeat;             }         }         return repeat;     } }
//开始以为只有abba式,结果不能完全通过,增加了aba式就通过了。代码有很多重复的地方,应该重构一下。
发表于 2019-04-02 21:01:12 回复(0)




public class Main{ public static boolean ispalindrome(String sub) { for(int i=0; i < sub.length()/2; i++)
        { if(sub.charAt(i) != sub.charAt(sub.length() - i - 1)) return false;
        } return true;
    } public static void main(String[] args) throws IOException {
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        String str = buf.readLine();
        String palin_str = str.substring(0,1); for (int i = 0; i < str.length(); i++) { for (int j = i + 1; j < str.length() + 1; j++) { if (ispalindrome(str.substring(i, j))){ if(str.substring(i, j).length() > palin_str.length())
                        palin_str = str.substring(i,j);
                }
            }
        }
        System.out.println(palin_str);
    }
}

编辑于 2019-03-05 06:04:13 回复(0)