문제 : 문자열 두개를 입력받아 순열여부 확인
<Check substring is permutation of main string>
1차 솔루션
code
```java
/** * Autor : Joosang Kim * Version : 1.0.0 * Method : check substring is permutation * Params : String * Return : Boolean */ public boolean stringPermutation(String str, String test){ boolean ret = false; permutation(str, str.length(), 0); //System.out.println(this.arrList.size()); if(arrList.contains(test)){ ret = true; } return ret; }
/**
* Autor : Joosang Kim
* Version : 1.0.0
* Method : permutate string
* Params : String
* Return : String
*/
public String permutation(String str, int total, int current){
String temp = "";
if(current+1 == total){
System.out.println(str);
arrList.add(str);
return str;
}
//current -> 0 total -> length
for(int i = current; i<total;i++){
temp = swap(str, i, current);
permutation(temp, total,current+1);
str = swap(temp, i, current);
}
return str;
}
public String swap(String str, int from, int to){
char[] charStr = str.toCharArray();
char temp = 0;
temp = charStr[from];
charStr[from] = charStr[to];
charStr[to] = temp;
return new String(charStr);
}
```
feedback
- 문자열 구성이 ASCII 인가 UTF-8인가?
- (영어)대소문자를 구별하는가
- 공백도 문자취급을 하는가?
풀이방법
두 문자열의 글자의 출현 횟수 세기
두 문자열에 출현하는 글자의 갯수와 종류가 동일하다면,
0 ~ 127 번까지 맵핑되어 있으며, 영어사용만 권장
UTF-8
- 0 ~ 127 사이의 문자는 1byte로 저장. 128이상인 것들은 2byte , 3byte로 늘려나감
2차 솔루션
ASCII 코드를 사용한다고 가정
Boolean 개념 도입
code
/** * Autor : Joosang Kim * Version : 1.0.0 * Method :Check String elements * Params : String * Return : Boolean */ public boolean checkStringElements(String str){ boolean ret = false; if(str.length() > 256){ // str contains multiple character return ret; } boolean[] char_set = new boolean[256]; for(int i = 0; i< str.length(); i++){ int val = str.charAt(i); if(char_set[val]){ return ret; } char_set[val]=true; } ret = true; return ret; }
- feedback
- ASCII 코드로 가정했으므로, 중복없는 문자는 최대 256 개 존재 가능( 그 이상 존재시 중복항 존재 문자열)
- 256사이즈의 boolean 배열에 문자열 원소값에 ASCII값을 대응.
- ASCII index에 true / false 구분