验证给定格式的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证给定格式的字符串相关的知识,希望对你有一定的参考价值。

最近,有人要求我实现一个有趣的算法。我有一个函数(isValidString)。它应该返回true,如果给定的字符串有效或无效。字符串模式看起来像一个有效的表达式。我的第一个想法是使用一个正则表达式,然后我决定收集一个对象中出现的字符串键,并检查它是否是偶数等等......但有很多其他情况下可以存在。请问有什么办法可以有效的实现这个算法?谢谢大家

下面是它的样子。

function isValidString(string) {

}

//Patterns for the valid string:

isValidString('{([])}') //should return true
isValidString('{(([{}]))}') //should return true
isValidString('{[[()]]}') //should return true

isValidString('{[}()]}') //should return false
isValidString('{{}()]}') //should return false
isValidString('{(})[]}') //should return false

答案

我假设 "有效 "是指那些括号平衡且格式良好的字符串。

你可以使用下面的函数。

const isValidString = (sample) => {
    const stack = [] // This is a helper stack we will push the characters
    // We start looping through the characters
    for (char of sample){
        // If its an opening bracket we just push it to the stack
        if (['(', '[', '{'].includes(char)) {
            stack.push(char)
        } else {
            // If we find a closing bracket we check if the previous matchs it as its opening bracket
            const last = stack.pop()
            // If doesnt match the previous bracket, we return false. We found a wrong formed bracket!
            // If it matches, contine looping
            if (
                char === ')' && last !== '(' || 
                char === '}' && last !== '{' || 
                char === ']' && last !== '['
            ) return false
        }
    }
    // If theres no characters left in the stack means that all opening brackets have been popped succesfully from the stack when we found its closing bracket
    return stack.length === 0
}

console.log(isValidString('{([])}')) //should return true
console.log(isValidString('{(([{}]))}')) //should return true
console.log(isValidString('{[[()]]}')) //should return true

console.log(isValidString('{[}()]}')) //should return false
console.log(isValidString('{{}()]}')) //should return false
console.log(isValidString('{(})[]}')) //should return false
另一答案

function isValidString(str){
    const matches = {
        "[": "]",
        "{": "}",
        "(": ")"
    }
    
    if(str.length % 2){
        return false
    }
    
    let len = str.length / 2
    str1 = str.substr(0,len)
    str2 = str.substr(len,str.length).split("").reverse().join("");
    
    return str1.split("").every((char,idx) => matches[char] == str2[idx])
}

console.log(isValidString('{([])}')) //should return true
console.log(isValidString('{(([{}]))}')) //should return true
console.log(isValidString('{[[()]]}')) //should return true

console.log(isValidString('{[}()]}')) //should return false
console.log(isValidString('{{}()]}')) //should return false
console.log(isValidString('{(})[]}')) //should return false

以上是关于验证给定格式的字符串的主要内容,如果未能解决你的问题,请参考以下文章

10个JavaScript代码片段,使你更加容易前端开发。

10个JavaScript代码片段,使你更加容易前端开发。

JavaScript 代码片段

21个常用代码片段

如何从我的 DatePicker 片段中传输格式化的日期字符串?

PHP 代码片段