Lettocde_290_Word Pattern

본 고 는 학습 중의 총 결 입 니 다. 전재 하 는 것 을 환영 하지만 출처 를 밝 혀 주 십시오.http://blog.csdn.net/pistolove/article/details/49717803
Given a  pattern  and a string  str , find if  str  follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in  pattern  and a non-empty word in  str .
Examples:
  • pattern =  "abba" , str =  "dog cat cat dog"  should return true.
  • pattern =  "abba" , str =  "dog cat cat fish"  should return false.
  • pattern =  "aaaa" , str =  "dog cat cat dog"  should return false.
  • pattern =  "abba" , str =  "dog dog dog dog"  should return false.

  • 생각:
    (1) 문 제 는 문자 스타일 과 문자열 을 지정 하 는 것 입 니 다. 이 문자열 이 주어진 스타일 인지 판단 해 야 합 니 다.
    (2) 주어진 pattern 은 여러 문자 로 구성 되 어 있 기 때문에 서로 다른 문 자 는 서로 다른 문자열 에 대응 해 야 하고 같은 문 자 는 같은 문자열 에 대응 해 야 합 니 다.이렇게 하면 맵 을 통 해 이 를 실현 할 수 있다.우선, pattern 을 문자 배열 pt 로 바 꾸 고 판단 할 문자열 을 문자열 배열 split 로 바 꿉 니 다.그 다음 에 두 배열 의 길이 가 다 르 면 일치 하 는 데 실패 합 니 다.그렇지 않 으 면 문자 배열 pt 를 옮 겨 다 니 며 현재 문자 가 Map 에 저장 되 어 있 지 않 으 면 판단 할 문자열 배열 split 가 해당 하 는 위치 에 있 는 값 이 Map 에 대응 하 는 Value 에 저장 되 어 있 는 지 여 부 를 판단 합 니 다. 저장 되 어 있 으 면 일치 하지 않 습 니 다. 그렇지 않 으 면 현재 위치 에 대응 하 는 문자 와 문자열 을 Map 에 저장 합 니 다.현재 옮 겨 다 니 는 문자 가 Map 에 대응 하 는 key 에 저장 되 어 있 으 면 key 에 대응 하 는 value 가 비어 있 는 지 판단 하고 비어 있 지 않 으 면 현재 value 값 과 split 에 대응 하 는 값 이 같 는 지 판단 하고 같 으 면 계속 합 니 다. 그렇지 않 으 면 일치 하 는 데 실 패 했 습 니 다.옮 겨 다 니 는 문자 가 Map 에 대응 하 는 key 에 저장 되 어 있 지 않 으 면 value 에 split 에 대응 하 는 값 이 있 는 지 판단 하고 있 으 면 일치 하 는 데 실 패 했 습 니 다. 그렇지 않 으 면 현재 key 와 value 를 Map 에 추가 합 니 다.
    (3) 자세 한 내용 은 아래 코드 를 보십시오.본문 이 너 에 게 도움 이 되 기 를 바란다.
    import java.util.HashMap;
    import java.util.Map;
    
    public class Word_Pattern {
    
    	public static void main(String[] args) {
    		System.err.println(wordPattern("abba", "dog dog dog dog"));
    	}
    
    	public static boolean wordPattern(String pattern, String str) {
    		char[] pt = pattern.toCharArray();
    		String[] split = str.split(" ");
    
    		if (pt.length != split.length)
    			return false;
    
    		Map<Character, String> map = new HashMap<Character, String>();
    
    		for (int i = 0; i < pt.length; i++) {
    			if (!map.containsKey(pt[i])) {
    				if (map.values().contains(split[i])) {
    					return false;
    				} else {
    					map.put(pt[i], split[i]);
    				}
    			} else {
    				if (map.get(pt[i]) != null) {
    					if (map.get(pt[i]).equals(split[i])) {
    						continue;
    					} else {
    						return false;
    					}
    				} else {
    					if (map.values().contains(split[i])) {
    						return false;
    					} else {
    						map.put(pt[i], split[i]);
    					}
    				}
    			}
    		}
    		return true;
    	}
    }
    

    좋은 웹페이지 즐겨찾기