Java 현재 문자열 찾기 최대 메타문자열 코드 공유

5314 단어
코드 먼저 보기

public class MaxHuiWen {
 
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s = "abb";
    MaxHuiWen(s);
  }
   
  //1.     
  public static void MaxHuiWen(String s){
    //        
    int length = s.length();
    //        
    String MaxString = "";
    //            
    for(int i = 0 ; i < length ; i++){
      for(int j = i ; j < length + 1 ; j++){
        String s1 = s.substring(i , j);
        //               MaxString   ,     MaxString
        if(HuiWen(s1) && s1.length() > MaxString.length()){
            MaxString = s1;
        }
        //System.out.println(s1);
      }
    }  
    //  MaxString      2,      
    if(MaxString.length() >= 2){
      System.out.println(MaxString);
    }
    else{
      System.out.println("     ");
    }
     
  }
   
  //2.           
  public static boolean HuiWen(String s){
    boolean flag = true;
    int length = s.length();
    char s1[] = s.toCharArray();
    //  ,  ,     ,    
    for(int i = 0 , j = length - 1 ; i <= j ; i++ , j--){
      if(s1[i] != s1[j]){
        flag = false;
      }
    }
    return flag;
  }
   
}

문자열의 회문 판단
문자열이 회문인지 아닌지 판단하기
String T="madam"과 같은 문자열을 지정하는 문제 설명이 문자열이 회문인지 아닌지 판단하기
방법1: 1, 두 문자열 요소 포인터를 정의(java에 포인터의 개념이 없음 주의), int right=T.length()-1;int left=0;
2, 즉left는 왼쪽에서,right는 오른쪽에서 시작하여 가리키는 문자가 같은지 순서대로 비교하고, 같으면left++,right-를 비교한다.그렇지 않으면, 직접 되돌아오는 것은 회문이 아니다

while(left 
 

코드:

/* 
   * 3: 
   *      
   *     :  ,  palindrome,                  ,  madam、   , 
   *    : 
   *   :    "  "           ,    "  "      ,     
   */ 
  public boolean isPalindrome(String s){ 
    if(s==null) 
      return false; 
    int left=0; 
    int right=s.length()-1; 
    while(left 
 

방법2: 회문 문자열은'madam'과 같이 모두 반전시키면 그 자체의'madam'을 얻어 두 문자열을 비교하고 서로 같으면 회문이다.
1, 문자열을 반전시키는 함수 구현

/* 
 *              
 */ 
private String reverse(String str){ 
  String strResult=""; 
  for(int i=str.length()-1;i>=0;i--){ 
    strResult+=str.charAt(i); 
  } 
  return strResult; 
} 
2,       s,      temp=reverse(s),     temp.equals(s)
/*
*       ,          ,   ,    ,    
*         O(n)
*/
public boolean isPalindrome2(String s){
String temp=reverse(s);
if(s.equals(temp))
return true;
else
return false;
}


2: 주어진 문자열의 최대 답장 문자열을 어떻게 구하는가
예를 들어 주어진 문자열 String T= Google은 가장 긴 메모 문자열'goog'을 어떻게 구합니까
1. 가장 간단하고 직접적인 생각은 문자열의 모든 하위 문자열을 찾아낸 다음에 각 하위 문자열이 회문인지 아닌지를 판단하고 기록하여 최대 길이의 회문을 구하는 것이다. * 알고리즘의 시간 복잡도는 O(n^3)이다.

/* 
 * 4,        
 *    :                      ,  google   ,     goog 
 *  : 
 *1,          :          ,              ,   ,            
 *        O(n^3) 
 */ 
public String longestPalindrome1(String s){ 
  String result=null; 
  String tempString=""; 
  //            
  int max=0; 
  //            
  for(int i=0;ii;j--){ 
      //              
      tempString=s.subStr( i, j+1); 
      //  tempString          (j-i+1)>max 
      if(isPalindrome(tempString)&&(j-i+1)>max){ 
        max=j-i+1; 
        result=subString(i, j+1); 
      } 
    } 
  } 
  return result; 
} 


2. 두 번째 사고방식은 문자열의 모든 문자에 대해 T[i]를 판단하는 것이다.
T[i], T[i+1]을 중심으로 하는 짝수 길이의 하위 문자열은 회문입니다
T[i] 중심의 홀수 길이 하위 문자열이 메모인지 여부

public String longestPalindrome2(String T){ 
    String result=null; 
    //             
    int max=0; 
    //       ,                  
    for(int i=0;i=0&&pEnd<=(T.length()-1)&&T.charAt(pStart)==T.charAt(pEnd)){ 
        pStart--; 
        pEnd++; 
      } 
      //         >max,                  =(pEnd-1)-(pStart+1)-1=pEnd-pStart-1 
      if(pEnd-pStart-1>max){ 
        max=pEnd-pStart-1; 
        result=subString( pStart+1, pEnd-1+1); 
      } 
       
      // i   ,              
      pStart=i-1; 
      pEnd=i+1; 
      while(pStart>=0&&pEnd<=(T.length()-1)&&T.charAt(pStart)==T.charAt(pEnd)){ 
        pStart--; 
        pEnd++; 
      } 
      if (pEnd-pStart-1>max) { 
        max=pEnd-pStart-1; 
        result=subStrint(T, pStart+1, pEnd-1+1); 
      } 
    } 
    return result; 
  } 

좋은 웹페이지 즐겨찾기