[leetCode-검색,DP] 139.단어 분할
설명: 분할할 때 사전의 단어를 반복해서 사용할 수 있습니다.
너는 사전에 중복된 단어가 없다고 가정할 수 있다.
1:
: s = "leetcode", wordDict = ["leet", "code"]
: true
: true "leetcode" "leet code"。
2:
: s = "applepenapple", wordDict = ["apple", "pen"]
: true
: true "applepenapple" "apple pen apple"。
。
3:
: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
: false
분석하다.
처음에는 KMP 폭력과 유사한 방법으로 s를 모직으로, wordDict의 단어마다 하위직으로 하고,s가 끝까지 일치하는 경우(하지만 모직이 aaaaaa이고 자직이 있는wirdDic={"aaaaa", "aa"}와 같은 형식의 일치하는 경우는 정확한 결과는 일치할 수 있지만 매번 먼저 aaaaaa로 일치하는 경우 마지막 aa를 모직으로 보충할 수 없기 때문에 이전에 선택한 폭력을 후회할 수 있는 방법이 필요하므로 아래의 검색을 사용하십시오!)
방법1: 폭력 검색 class Solution {
public boolean wordBreak(String s, List wordDict) {
return word_Break(s, wordDict, 0);
}
public boolean word_Break(String s, List wordDict, int start) {
if (start == s.length()) {
return true;
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end)) && word_Break(s, wordDict, end)) {
return true;
}
}
return false;
}
}
기억형 검색(최적화) public static boolean wordBreak(String s, List wordDict) {
Boolean[] mem = new Boolean[s.length()+2];
return word_Break(s, wordDict, 0,mem);
}
public static boolean word_Break(String s, List wordDict, int start,Boolean[] mem) {
if (start == s.length()) {
return true;
}
if (mem[start] != null) {
return mem[start];
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end)) && word_Break(s, wordDict, end, mem)) {
return mem[end] = true;
}
}
return mem[start] = false;
}
메서드2: DP public static boolean wordBreak(String s, List wordDict) {
int len = s.length();
boolean[] dp = new boolean[len + 2];
dp[0] = true;
for(int i = 1 ;i <= len;i++){
for(int j = 0;j < wordDict.size();j++) {
if( i >= wordDict.get(j).length() && s.substring(i-wordDict.get(j).length(),i).contains( wordDict.get(j)) ) {
dp[i] = dp[i] || dp[i - wordDict.get(j).length()];
}
}
}
return dp[len];
//return word_Break(s, wordDict, 0);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[UVA 1629] Cake slicing[기억화 검색]
제목 링크: [UVA 1629] Cake slicing
제목 분석: 한 직사각형 케이크에 체리가 여러 개 있는데, 지금 해야 할 일은 가장 적은 거리를 잘라서 직사각형 모양의 작은 케이크를 잘라서 케이크마다 체리가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
class Solution {
public boolean wordBreak(String s, List wordDict) {
return word_Break(s, wordDict, 0);
}
public boolean word_Break(String s, List wordDict, int start) {
if (start == s.length()) {
return true;
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end)) && word_Break(s, wordDict, end)) {
return true;
}
}
return false;
}
}
기억형 검색(최적화) public static boolean wordBreak(String s, List wordDict) {
Boolean[] mem = new Boolean[s.length()+2];
return word_Break(s, wordDict, 0,mem);
}
public static boolean word_Break(String s, List wordDict, int start,Boolean[] mem) {
if (start == s.length()) {
return true;
}
if (mem[start] != null) {
return mem[start];
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end)) && word_Break(s, wordDict, end, mem)) {
return mem[end] = true;
}
}
return mem[start] = false;
}
메서드2: DP public static boolean wordBreak(String s, List wordDict) {
int len = s.length();
boolean[] dp = new boolean[len + 2];
dp[0] = true;
for(int i = 1 ;i <= len;i++){
for(int j = 0;j < wordDict.size();j++) {
if( i >= wordDict.get(j).length() && s.substring(i-wordDict.get(j).length(),i).contains( wordDict.get(j)) ) {
dp[i] = dp[i] || dp[i - wordDict.get(j).length()];
}
}
}
return dp[len];
//return word_Break(s, wordDict, 0);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[UVA 1629] Cake slicing[기억화 검색]
제목 링크: [UVA 1629] Cake slicing
제목 분석: 한 직사각형 케이크에 체리가 여러 개 있는데, 지금 해야 할 일은 가장 적은 거리를 잘라서 직사각형 모양의 작은 케이크를 잘라서 케이크마다 체리가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
public static boolean wordBreak(String s, List wordDict) {
Boolean[] mem = new Boolean[s.length()+2];
return word_Break(s, wordDict, 0,mem);
}
public static boolean word_Break(String s, List wordDict, int start,Boolean[] mem) {
if (start == s.length()) {
return true;
}
if (mem[start] != null) {
return mem[start];
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end)) && word_Break(s, wordDict, end, mem)) {
return mem[end] = true;
}
}
return mem[start] = false;
}
public static boolean wordBreak(String s, List wordDict) {
int len = s.length();
boolean[] dp = new boolean[len + 2];
dp[0] = true;
for(int i = 1 ;i <= len;i++){
for(int j = 0;j < wordDict.size();j++) {
if( i >= wordDict.get(j).length() && s.substring(i-wordDict.get(j).length(),i).contains( wordDict.get(j)) ) {
dp[i] = dp[i] || dp[i - wordDict.get(j).length()];
}
}
}
return dp[len];
//return word_Break(s, wordDict, 0);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[UVA 1629] Cake slicing[기억화 검색]제목 링크: [UVA 1629] Cake slicing 제목 분석: 한 직사각형 케이크에 체리가 여러 개 있는데, 지금 해야 할 일은 가장 적은 거리를 잘라서 직사각형 모양의 작은 케이크를 잘라서 케이크마다 체리가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.