lintcode 계단훈련 제5관(9장)
10. 문자열의 다른 배열
public class Solution {
public List stringPermutation2(String str) {
List results = new ArrayList<>();
if (str == null) {
return results;
}
ArrayList list = new ArrayList<>();
char[] s = str.toCharArray();
Arrays.sort(s);
boolean[] flag = new boolean[s.length];
dfsHelper(s, flag, list, results);
return results;
}
private void dfsHelper(char[] s,
boolean[] flag,
ArrayList list,
List results) {
if (list.size() == s.length) {
results.add(toStr(list));
}
for (int i = 0; i < s.length; i++) {
if (flag[i]) {
continue;
}
if (i != 0 && s[i] == s[i - 1] && !flag[i - 1]) {
continue;
}
list.add(s[i]);
flag[i] = true;
dfsHelper(s, flag, list, results);
flag[i] = false;
list.remove(list.size() - 1);
}
}
private String toStr(ArrayList list) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
return sb.toString();
}
}
135, 디지털 조합
public class Solution {
public List<List> combinationSum(int[] candidates, int target) {
List<List> result = new ArrayList<List>();
if (candidates == null || candidates.length == 0) {
return result;
}
Arrays.sort(candidates);
List list = new ArrayList<>();
dfsHelper(candidates, 0, 0, target, list, result);
return result;
}
private void dfsHelper(int[] candidates,
int pos,
int sum,
int target,
List list,
List<List> result) {
if (sum == target) {
result.add(new ArrayList(list));
}
for (int i = pos; i < candidates.length; i++) {
if (i != pos && candidates[i] == candidates[i - 1]) {
continue;
}
if (candidates[i] + sum > target) {
break;
}
list.add(candidates[i]);
dfsHelper(candidates, i, candidates[i] + sum, target, list, result);
list.remove(list.size() - 1);
}
}
}
153, 디지털 조합 II
public class Solution {
public List<List> combinationSum2(int[] num, int target) {
List<List> result = new ArrayList<List>();
if (num == null || num.length == 0) {
return result;
}
List list = new ArrayList<>();
Arrays.sort(num);
dfsHelper(num, 0, 0, target, list, result);
return result;
}
private void dfsHelper(int[] num,
int pos,
int sum,
int target,
List list,
List<List> result) {
if (sum == target) {
result.add(new ArrayList(list));
}
for (int i = pos; i < num.length; i++) {
if (i != pos && num[i] == num[i - 1]) {
continue;
}
if (num[i] + sum > target) {
break;
}
list.add(num[i]);
dfsHelper(num, i + 1, num[i] + sum, target, list, result);
list.remove(list.size() - 1);
}
}
}
136, 분할 회문열
public class Solution {
public List<List<String>> partition(String s) {
List<List<String>> results = new ArrayList<List<String>>();
if (s == null || s.length() == 0) {
return results;
}
List<String> list = new ArrayList<String>();
dfsHelper(s, list, results);
return results;
}
private void dfsHelper(String s,
List<String> list,
List<List<String>> results) {
if (s.length() == 0) {
results.add(new ArrayList<String>(list));
}
for (int i = 0; i < s.length(); i++) {
if (!isPalind(s, i)) {
continue;
}
list.add(s.substring(0, i + 1));
dfsHelper(s.substring(i + 1), list, results);
list.remove(list.size() - 1);
}
}
private boolean isPalind(String s, int i) {
int start = 0;
int end = i;
while (start < end) {
if (s.charAt(start++) != s.charAt(end--)) {
return false;
}
}
return true;
}
}
108, 분할 회문열 II
public class Solution {
public int minCut(String s) {
if (s == null || s.length() == 0) {
return 0;
}
boolean[][] isPalind = isPalindrome(s);
int[] f = new int[s.length() + 1];
f[0] = 0;
for (int i = 1; i <= s.length(); i++) {
f[i] = i;
for (int j = 0; j < i; j++) {
if (isPalind[j][i - 1]) {
f[i] = Math.min(f[i], f[j] + 1);
}
}
}
return f[s.length()] - 1;
}
private boolean[][] isPalindrome(String s) {
int len = s.length();
boolean[][] isPalind = new boolean[len][len];
for (int i = 0; i < len; i++) {
isPalind[i][i] = true;
}
for (int i = 0; i < len - 1; i++) {
isPalind[i][i + 1] = s.charAt(i) == s.charAt(i + 1);
}
for (int length = 2; length < len; length++) {
for (int start = 0; start + length < len; start++) {
isPalind[start][start + length] = isPalind[start + 1][start + length - 1] && (s.charAt(start) == s.charAt(start + length));
}
}
return isPalind;
}
}
211. 문자열 바꾸기
public class Solution {
public boolean stringPermutation(String A, String B) {
if (A.length() != B.length()) {
return false;
}
int[] flag = new int[1000];
int len = A.length();
for (int i = 0; i < len; i++) {
flag[A.charAt(i)]++;
}
for (int i = 0; i < len; i++) {
flag[B.charAt(i)]--;
}
for (int i = 0; i < len; i++) {
if (flag[A.charAt(i)] != 0) {
return false;
}
}
return true;
}
}
51. 이전 정렬
public class Solution {
public ArrayList previousPermuation(ArrayList nums) {
int n = nums.size();
int i = n - 1;
while (i != 0 && nums.get(i) >= nums.get(i - 1)) {
i--;
}
if (i == 0) {
reverse(nums, 0, n - 1);
return nums;
}
reverse(nums, i, n - 1);
int j = i;
for (; j < n - 1; j++) {
if (nums.get(j) < nums.get(i - 1)) {
break;
}
}
swap(nums, i - 1, j);
return nums;
}
private void swap(ArrayList nums, int i, int j) {
int temp = nums.get(i);
nums.set(i, nums.get(j));
nums.set(j, temp);
}
private void reverse(ArrayList nums, int start, int end) {
for (; start < end; start++, end--) {
swap(nums, start, end);
}
}
}
52. 다음 줄
public class Solution {
public int[] nextPermutation(int[] nums) {
if (nums == null) {
return nums;
}
int n = nums.length;
int i = n - 1;
while (i != 0 && nums[i] <= nums[i - 1]) {
i--;
}
if (i == 0) {
reverse(nums, i, n - 1);
return nums;
}
int j = n - 1;
for (; j > i - 1; j--) {
if (nums[j] > nums[i - 1]) {
break;
}
}
swap(nums, i - 1 , j);
reverse(nums, i, n - 1);
return nums;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums, int start, int end) {
for (; start < end; start++, end--) {
swap(nums, start, end);
}
}
}
190、다음 줄
public class Solution {
public void nextPermutation(int[] nums) {
if (nums == null) {
return;
}
int n = nums.length;
int i = n - 1;
while (i != 0 && nums[i] <= nums[i - 1]) {
i--;
}
if (i == 0) {
reverse(nums, 0, n - 1);
return;
}
int j = n - 1;
for (; j > i - 1; j--) {
if (nums[j] > nums[i - 1]) {
break;
}
}
swap(nums, i - 1, j);
reverse(nums, i, n - 1);
return;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums, int start, int end) {
for(; start < end; start++, end--) {
swap(nums, start, end);
}
}
}
197. 정렬 번호
public class Solution {
public long permutationIndex(int[] A) {
int[] flag = new int[A.length];
for (int i = 0; i < A.length; i++) {
for (int j = i + 1; j < A.length; j++) {
if (A[i] > A[j]) {
flag[i]++;
}
}
}
long result = 0;
for (int i = 0; i < A.length; i++) {
result += flag[i] * Jec(A.length - i - 1);
}
return result + 1;
}
private long Jec(int x) {
long ans = 1;
while (x > 0) {
ans *= (long) x;
x--;
}
return ans;
}
}
198, 정렬 번호 II
public class Solution {
public long permutationIndexII(int[] A) {
Map map = new HashMap<>();
for (int i = 0; i < A.length; i++) {
if (map.containsKey(A[i])) {
map.put(A[i], map.get(A[i]) + 1);
} else {
map.put(A[i], 1);
}
}
long result = 0;
for (int i = 0; i < A.length; i++) {
Map flag = new HashMap<>();
for (int j = i + 1; j < A.length; j++) {
if (A[i] > A[j] && !flag.containsKey(A[j])) {
flag.put(A[j], 1);
map.put(A[j], map.get(A[j]) - 1);
result += getNum(map);
map.put(A[j], map.get(A[j]) + 1);
}
}
map.put(A[i], map.get(A[i]) - 1);
}
return result + 1;
}
private long getNum(Map map) {
int sum = 0;
long dup = 1;
for (Integer v : map.values()) {
if (v == 0) {
continue;
}
sum += v;
dup *= Jec(v);
}
if (sum == 0) {
return sum;
}
return Jec(sum) / dup;
}
private long Jec(int x) {
long ans = 1;
while (x > 0) {
ans *= (long) x;
x--;
}
return ans;
}
}
107 단어 구분
public class Solution {
public boolean wordBreak(String s, Set dict) {
if (s == null || s.length() == 0) {
return true;
} //?
if (dict.isEmpty()) {
return false;
}
int n = s.length();
boolean[] flag = new boolean[n + 1];
flag[n] = true;
int maxLen = getMax(dict);
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j - i <= maxLen && j <= n; j++) {
if (!flag[j]) {
continue;
}
String sub = s.substring(i, j);
if (dict.contains(sub)) {
flag[i] = true;
}
}
}
return flag[0];
}
private int getMax(Set dict) {
int maxLen = Integer.MIN_VALUE;
for (String d : dict) {
maxLen = Math.max(maxLen, d.length());
}
return maxLen;
}
}
맥스렌 없으면 시간 초과~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.