Sherlock和Valid String hackerank挑战

时间:2017-01-24 19:43:44

标签: javascript string

我试图解决Hackerank中的这个特定挑战,但我无法通过所有测试用例。 2是使其成为有效字符串所需的最小删除次数。它可以通过以下两种方式完成:

input = aabbcd ...

样品输出必须为否....

解释

删除c和d以获得aabb。 或者删除a和b以获得abcd。

这是我的代码:

function processData(input) {
    //Enter your code here
   var unique = "";
    var counter = 0;
    var different ="";
  for (i = 0; i < input.length; i++) {
    if (input.lastIndexOf(input[i]) == input.indexOf(input[i])) {
      unique += input[i];

    }counter ++;
  var count1 = (input.match(/input[i]/) || []).length;
  }
    if (counter <= 1)
    {
        console.log("YES");
    }
    else if (counter > 1){
        console.log("NO"); 
    }
    //console.log(count1);
    //console.log(unique);
}

3 个答案:

答案 0 :(得分:0)

您的算法失败,因为您的解决方案无法解决问题。 您最后检查字符串是否可接受使用计数器

  if (counter <= 1)
    {
        console.log("YES");
    }
    else if (counter > 1){
        console.log("NO"); 
    }

然而,每次你的for循环运行时,计数器都会递增。这意味着您的解决方案只通过了解决问题的测试,并且#34; NO&#34;默认情况下。

此外,您创建了一个名为different的变量,您从未使用过该变量,unique和count1都是赋值,但之后从未使用过。

您的算法应该检查每个字符串的频率,并查看每个字符串是否相同(或者相差最多1)。您的算法仅检查字母的唯一性。我建议使用

计算每个字母的出现次数
input.match(/input[i]/).length;

并比较频率

答案 1 :(得分:0)

这是我的答案。要记住的要点 1.作为输入的一部分,确保你修改了你的逃脱\ n。 2.计算字符的出现次数。 3.将char计数映射到它们的出现位置。 4.现在检查出现是否为1 =&gt;如果2,请确保检查至少一个事件计数是1 ex:aabbcd c和d出现2次并且两者都将char计数为1,因此他必须同时删除c和d。

注意:在问题中没有说明同一个字符可以被删除多次,它仍然可以被视为一个删除ex:aabbcccc我有4个c但是我可以使用一个操作删除2个C以使其成为有效的字符串aabbcc。

var bIsValidString = false;
var oCharMapCount = input.trim().split("").reduce((acc, val) => {
    if (acc[val]) {
        acc[val] += 1;
    }
    else {
        acc[val] = 1;
    }
    return acc;
}, {});
var oCharOccuranceMap = {}; 
for(let key in oCharMapCount) {
    if (oCharOccuranceMap[oCharMapCount[key]]) {
        oCharOccuranceMap[oCharMapCount[key]] += 1;
    }
    else {
        oCharOccuranceMap[oCharMapCount[key]] = 1;
    }
}
var iCharOccurances = (Object.keys(oCharOccuranceMap) || []).length;

if (iCharOccurances === 1) {
    bIsValidString = true;
}
else if (iCharOccurances === 2) {
    for (let iCharCountOccurance in oCharOccuranceMap) {
        if (oCharOccuranceMap[iCharCountOccurance] === 1) {
            bIsValidString = true;
        }
    }
}
else {
    bIsValidString = false;
}

(bIsValidString) ? console.log("YES") : console.log("NO");

答案 2 :(得分:0)

在 2 个测试用例失败的情况下进行了几次迭代后,我终于想出了下面的正确解决方案。

//create histogram to count occurances of each char in string
let chars               = s.reduce(into: [:]) { $0[$1, default:0] += 1 }

//create set for occurances to determine the number of different occurances found
let valueSet:Set<Int> = Set(chars.values)
var isValid = false

//if all chars have same occurrance
if valueSet.count == 1 {
    isValid = true
}
//if there are more than two different occurance counts
else if valueSet.count > 2 {
    isValid = false
} 
//check different frequencies counts
else {
    
    let freq1 = valueSet.min()!
    let freq2 = valueSet.max()!
    
    var freq1Count = 0
    var freq2Count = 0
    
    //loop through all values to count the amount of times each different occurance count occur
    for value in chars.values {
        switch value {
        case freq1:
            freq1Count += 1
        default:
            freq2Count += 1
        }
    }
    
    //if either freq count is 1 and it that count only occurs once
    if (freq1 == 1 && freq1Count == 1) ||
       (freq2 == 1 && freq2Count == 1) {
        isValid = true
    }
    //if the difference between frequencies is one and there is only one of them
    else if abs(freq1 - freq2) == 1 && (freq1Count == 1 || freq2Count == 1) {
        isValid = true
    }
    else {
        isValid = false
    }
}

return isValid ? "YES" : "NO"