()*  -> In-valid
()(* -> valid
*)() -> valid
()** -> valid
)(   -> In-valid
)*   -> In-valid

我try 并坚持实现代码,因为我知道我们必须处理堆栈,但我只是停留在那里,能有人PHP专家做了吗:)并解释它.

  • 输入将是类似"()*"的字符串.
  • "*"可用作开括号和闭括号
  • 在有效表达式中,开(左)括号应包含右(右)括号.

我试着用以下代码来做,不知道我的方向是否正确:)

$scenario = "()*";
$stackOne = str_split($scenario);
$stackTwo = array();
$counter = 1;
function push(array $arr, ?string $value)
{
    $arr[] = $value;
    return $arr;
}

function pop(array $arr)
{
    $count = count($arr) -1;
    if ($count > 0) unset($arr[$count]);
    return $arr;
}

function isValid(array $arr,string $value)
{
    $mapping= [
        "*" => ["(", ")", "*"],
        "(" => ["*", ")"],
        ")" => ["*", "("],
    ];
    if (empty($arr)) return "push";
    dd($arr[count($arr) - 1]);
    if(in_array($arr[count($arr) - 1] ,$mapping[$value])) return "pop";
}

foreach ($stackOne as $key => $value) {
    $output = isValid($stackTwo, $value);
    if ($output === "push") {
        $stackTwo = push($stackTwo, $value);
    } elseif ($output === "pop") {
        $stackTwo = pop($stackTwo);
    }
}

print_r($stackTwo);

推荐答案

您可以使用4个条件判断余额有效性:

  • 如果有),到目前为止,我们的帐户中至少应该有(*个,这两个都可以.

  • 如果有足够的*()配对.

  • 如果还剩下*个,我们可以将它们用作()对,也可以将它们用作空白.在这里,剩余计数是偶数还是奇数无关紧要,因为我们可以将它们替换为空白.

  • 末端可能有剩余的开口大括号.为了平衡这一点,我们需要在它们之后有*个,将它们与)配对.因此,我们在最后再运行一次以判断其有效性.

Snippet:

<?php

function isValid($str){
    $star = 0;
    $open = [];
    $len = strlen($str);
    
    for($i = 0; $i < $len; ++$i){
        if($str[ $i ] == ')'){
            if(count($open) > 0) array_pop($open);
            elseif($star > 0) $star--;
            else return false;
        }elseif( $str[ $i ] == '('){
            array_push($open, $i);
        }else{
            $star++;
        }
    }
    
    if(count($open) === 0) return true;
    // check leftover open braces from the back
    $star = $ptr = 0;
    $open = array_reverse($open);
    
    for($i = $len - 1; $i >= 0 && $ptr < count($open); --$i){
        if($str[ $i ] == '*'){
            $star++;
        }else if($i == $open[ $ptr ]){
            if($star == 0) return false;
            $star--;
            $ptr++;
        }
    }
    
    return true;
}

Online Demo

Php相关问答推荐

PHP:从数组中获取唯一的数字组合

以编程方式更改新订单、已取消订单和失败订单的邮箱WooCommerce通知

致命错误:未捕获错误:Google\Auth\HttpHandler\HttpHandlerFactory::build()

如何删除WordPress用户的个人资料描述或其他个人资料字段中的链接?

如何限制WordPress自定义分类术语页面中的术语数量

如何在函数中定位WooCommerce产品循环

闭包绑定$This和垃圾收集器

Laravel:测试命令时无法获取工作通知::AssertSentTo

如何使用php一次更新两个数据库中的MySQL表

当配置的URL为空时禁用Laravel Slack日志(log)记录

在WooCommerce管理中 for each 运输方法设置添加自定义字段

Regex|PHP捕获json字符串中的每个非法双引号

为什么 php 只能在我的 Nginx Web 服务器的某些目录中工作?

在 WooCommerce 管理变量产品中启用其他变体图像

向元素添加类时添加循环错误

Google Sheets PHP API - 添加多个选项卡时出现问题

我需要一个正则表达式模式来获取在不包含特定字符串后面的模式中的文本

Laravel:ArgumentCountError: 函数 App\Mail 的参数太少

如何将子查询结果添加到学说 2 中主查询的末尾?

Laravel - 关联与设置观察者事件的 ID