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에 따라 라이센스가 부여됩니다.