为什么我的for循环不递增,为什么我的接头没有变化?

时间:2019-09-11 17:57:26

标签: javascript arrays string hashmap

我遇到了一个看似很简单的问题,但是当我编写更多代码时,我的预期收益有些不像我预期的那样。

感谢您的帮助。如果您确实提供了任何帮助,请说明您的方法以及我如何陷入困境。

问题:

  

我们得到了一个字符串,需要查看它是否可以从字典数组中分解为单词。例如:

     
const str = "applecomputer";
const dictArr = ["apple", "computer"];
stringBreakdown(str, dictArr);
// true
     

假设字典数组中没有重复项,您是否可以编写一个方法,如果可以将字符串分解为数组中的单词,该方法将返回true;否则,将返回false?

两个测试用例:

Expect stringBreakdown('crazyrichasians', [ 'crazy', 'rich', 'asians' ]) // to return true

Expect stringBreakdown('lockcombination', [ 'lock', 'combo' ]) // to return false

我的代码和方法:

  • 创建字符串中所有字符的哈希图
  • 创建一个辅助函数,从数组中的每个字符串中删除宪章
  • 当我删除字符串中的字符时,每次从哈希图中看到该字母时,我也会减少
  • 如果我看到该字符串中的所有字母,则将其从给定数组中删除
  • 最后,如果给定的数组长度小于0,则返回true,因为我能够写出所有单词,或者因为数组中包含更多单词而将其变为false
const stringBreakdown = (str, dictArr)=> {
  let hashDictionary = {};
  let shouldRemoveWord

  for(let x = 0; x <= str.length-1;x++){
    !hashDictionary[str[x]]  ? hashDictionary[str[x]] =1 : hashDictionary[str[x]]+=1
  }

for(let y = 0; y < dictArr.length;y++ ){
  shouldRemoveWord = removeLetters(hashDictionary,dictArr[y]) 
    if(shouldRemoveWord === true){
      dictArr.splice(y,1)
    }
  }
  console.log('dictArr',dictArr)
  return dictArr.length > 0 ? true : false;
}

const removeLetters = (hash,word) =>{
let modifiedWord = word.split('')

for(let k = 0; k < modifiedWord.length;k++){
    if(hash[word[k]]){
     modifiedWord.splice(k,1)
     hash[word[k]]-=1
   }
}
 return modifiedWord.join('').length < 0  ? true : false;
}

2 个答案:

答案 0 :(得分:1)

简单地遍历字典

File "main.py", line 156, in scrape_years
    'reviewBodyCell').find_element_by_tag_name('p')

答案 1 :(得分:1)

您可以遍历数组中提供的每个单词,然后:

首先,检查组合在一起的所有单词的长度是否与被测字符串的长度匹配。如果没有返回false

第二,如果长度匹配,则检查是否每个单词作为一个整体包含在所提供的字符串中作为子字符串:

function stringBreakdown(str, dictArr){
  return dictArr.join("").length === str.length
         && 
         dictArr.every(word => str.includes(word)); 
}
//tests
console.log(stringBreakdown('crazyrichasians', [ 'crazy', 'rich', 'asians' ]));
console.log(stringBreakdown('lockcombination', [ 'lock', 'combo' ]));
console.log(stringBreakdown('applecomputer', [ 'apple', 'computer']));
console.log(stringBreakdown('appelcomputer', [ 'apple', 'computer']));
console.log(stringBreakdown('appcolemputer', [ 'apple', 'computer']));
console.log(stringBreakdown('applecomputer', [ 'app', 'le', 'computer']));

您的方法是可疑的,因为当您逐个字符地浏览每个字符时,您不会查看它形成的单词,即在您的情况下,如果applecomputer是字符串并且数组具有['appel','comterpu' ]在这种情况下,您的算法将返回true

这是因为您要根据输入字符串str创建一个字符映射,然后遍历每个单词的字符并递减每个字符在字符映射中的出现,因此组合无关紧要。

const stringBreakdown = (str, dictArr)=> {
  let hashDictionary = {};
  let shouldRemoveWord

  for(let x = 0; x <= str.length-1;x++){
    !hashDictionary[str[x]]  ? hashDictionary[str[x]] =1 : hashDictionary[str[x]]+=1
  }

for(let y = 0; y < dictArr.length;y++ ){
  shouldRemoveWord = removeLetters(hashDictionary,dictArr[y]) 
    if(shouldRemoveWord === true){
      dictArr.splice(y,1)
    }
  }
  return dictArr.length > 0 ? true : false;
}

const removeLetters = (hash,word) =>{
let modifiedWord = word.split('')

for(let k = 0; k < modifiedWord.length;k++){
    if(hash[word[k]]){
     modifiedWord.splice(k,1)
     hash[word[k]]-=1
   }
}
 return modifiedWord.join('').length < 0  ? true : false;
}
//doesn't work outputs true
console.log(stringBreakdown('applecomputer', ['appel', 'computer']));