LeeCode 10 DFS / DP

本文探讨了LeetCode上的正则表达式匹配问题,通过深度优先搜索(DFS)和动态规划(DP)两种方法详细解析了解决方案。针对′a−z′与′.′的匹配,介绍了指针移动策略;对于′∗′的处理,阐述了匹配零个或多个前一元素的逻辑。同时,提供了C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

传送门 LeeCode 10. 正则表达式匹配

题解
DFS

对于 ′ a − z ′ 'a-z' az ′ . ′ '.' . 只需判断字符串 s s s 与字符规律 p p p 的当前字符是否匹配,若匹配成功 s , p s,p s,p 指针移动至下一位置匹配后续字符;反之,匹配失败。

考虑到 ′ ∗ ′ '*' 匹配零个或多个前面的那一个元素,则若 p p p 当前匹配字符的下一字符为 ′ ∗ ′ '*' ,则可以匹配或不匹配当前字符,根据回溯结果判断匹配结果。

class Solution
{
public:
    bool match(string &s, string &p, int i, int j)
    {
        if (j == p.length()) return i == s.length();
        bool f = (i < s.length() && (s[i] == p[j] || p[j] == '.'));
        if (j + 1 < p.length() && p[j + 1] == '*')
        {
            return match(s, p, i, j + 2) || (f ? match(s, p, i + 1, j) : f);
        }
        return f ? match(s, p, i + 1, j + 1) : f;
    }
    bool isMatch(string s, string p)
    {
        return match(s, p, 0, 0);
    }
};
DP

d f s dfs dfs 的思考写为递推式, d p [ i ] [ j ] dp[i][j] dp[i][j] 代表字符规律 p p p 的区间 [ 0 , i − 1 ] [0,i-1] [0,i1] 与字符串 s s s 的区间 [ 0 , j − 1 ] [0,j-1] [0,j1] 匹配的结果, f l a g flag flag 判断字符是否匹配
f l a g = { 1 j = = 0   ∣ ∣   p [ i − 1 ] = = ′ . ′   ∣ ∣   p [ i − 1 ] = = s [ j − 1 ] 0 o t h e r w i s e flag=\begin{cases} 1 & j==0\ ||\ p[i-1]=='.'\ ||\ p[i-1]==s[j-1]\\ 0 & otherwise\\ \end{cases} flag={10j==0  p[i1]==.  p[i1]==s[j1]otherwise

{ i f ( p [ i − 1 ] = = ′ ∗ ′ ) c o n t i n u e e l s e   i f ( p [ i ] = = ′ ∗ ′ ) d p [ i + 1 ] [ j ] { d p [ i − 1 ] [ j − 1 ]   ∣ ∣   d p [ i + 1 ] [ j − 1 ]   ∣ ∣   d p [ i − 1 ] [ j ] f l a g = 1 d p [ i − 1 ] [ j ] o t h e r w i s e   e l s e d p [ i ] [ j ] = { d p [ i − 1 ] [ j − 1 ] f l a g = 1 f a l s e o t h e r w i s e \begin{cases} if(p[i-1]=='*') & continue\\ else\ if(p[i]=='*')& dp[i+1][j]\begin{cases} dp[i-1][j-1]\ ||\ dp[i+1][j-1]\ ||\ dp[i-1][j]&flag=1\\ dp[i-1][j] & otherwise \\ \end{cases}\ \\ else& dp[i][j]=\begin{cases} dp[i-1][j-1]&flag=1\\ false& otherwise\end{cases}\\ \end{cases} if(p[i1]==)else if(p[i]==)elsecontinuedp[i+1][j]{dp[i1][j1]  dp[i+1][j1]  dp[i1][j]dp[i1][j]flag=1otherwise dp[i][j]={dp[i1][j1]falseflag=1otherwise

class Solution
{
public:
    bool judge(char p, char s)
    {
        return s == 'X' ? 0 : (p == '.' || p == s);
    }
    bool isMatch(string s, string p)
    {
        int n = p.length(), m = s.length();
        vector<vector<bool>> dp(n + 1, vector<bool>(m + 1, 0));
        dp[0][0] = 1;
        for (int i = 1; i <= n; i++)
        {
            if (p[i - 1] == '*')
                continue;
            if (i == n || p[i] != '*')
            {
                for (int j = 1; j <= m; j++)
                {
                    dp[i][j] = judge(p[i - 1], s[j - 1]) ? dp[i - 1][j - 1] : 0;
                }
            }
            else
            {
                for (int j = 0; j <= m; j++)
                {
                    dp[i + 1][j] = judge(p[i - 1], j == 0 ? 'X' : s[j - 1]) ? (dp[i - 1][j - 1] || dp[i + 1][j - 1] || dp[i - 1][j]) : dp[i - 1][j];
                }
            }
        }
        return dp[n][m];
    }
};
<think>好的,我现在需要处理用户提供的关于Hadoop目录权限的日志信息。首先,用户之前已经询问过关于HDFS数据目录权限的问题,并且得到了解决方案,现在他们展示了执行命令后的结果,可能需要确认权限是否正确修改,或者是否存在其他问题。 首先,我需要仔细查看用户提供的命令和输出。用户首先以root身份在hadoop03节点上执行了chmod 755修改data目录权限,然后退出到hadoop用户,执行ls -ld,显示权限变为drwxr-xr-x,属主和组都是hadoop,看起来正确。接着在hadoop02节点上,同样以root执行chmod 755,退出后检查显示权限同样正确,但需要注意的是hadoop03的data目录显示是2个子目录,而hadoop02显示的是3个,这可能涉及到目录结构的变化,或者是时间戳的不同。 接下来,我需要分析用户可能的问题是什么。用户可能是在确认权限修改是否成功,或者是否存在其他潜在问题。比如,虽然权限已经改为755,但Hadoop服务是否正常运行?或者是否存在其他节点也需要同样的修改? 另外,用户可能在多个节点上执行了权限修改,需要确认所有DataNode节点的data目录权限是否一致。用户提供的输出显示hadoop03和hadoop02都修改成功,但需要检查是否还有其他节点需要处理。 此外,之前的回答中提到了父目录权限和SELinux的问题,用户可能没有检查这些,导致即使data目录权限正确,Hadoop仍然出现问题。需要提醒用户检查父目录的权限,例如/home/hadoop/bigdatasoftware/hadooptmp/dfs的权限是否为755,以及SELinux是否启用。 还有可能用户遇到了修改权限后服务仍然无法启动的情况,需要进一步查看日志。或者用户在执行命令时是否有遗漏的步骤,比如没有停止Hadoop服务就直接修改权限,导致数据损坏或服务无法识别新的权限设置。 另外,注意到在hadoop03上,data目录的子目录数量是2,而hadoop02上是3,这可能正常,因为不同DataNode可能存储的数据块数量不同,但需要确认是否存在异常情况,比如某些节点未能正确初始化数据目录。 总结来说,用户可能需要确认以下几点: 1. 所有相关节点的data目录权限是否正确设置为755。 2. 父目录的权限是否也正确。 3. SELinux是否影响服务访问。 4. 修改权限后是否重启了Hadoop服务,并检查日志是否有错误。 5. 确认集群中所有DataNode节点的配置是否一致,避免因权限不一致导致的问题。 此外,用户可能希望了解后续的验证步骤,确保Hadoop集群正常运行,例如使用hdfs dfsadmin -report检查DataNode是否正常注册,以及测试文件上传下载是否成功。</think>--- ### **操作过程解析** 根据你提供的操作记录和结果,整理如下: --- #### **步骤 1:在 hadoop03 节点修改权限** 1. **以 root 用户执行权限修改**: ```bash [root@hadoop03 dfs]# chmod 755 /home/hadoop/bigdatasoftware/hadooptmp/dfs/data [root@hadoop03 dfs]# exit ``` 2. **验证权限**(切换回 hadoop 用户): ```bash [hadoop@hadoop03 dfs]$ ls -ld /home/hadoop/bigdatasoftware/hadooptmp/dfs/data drwxr-xr-x. 2 hadoop hadoop 4096 10月 16 11:43 /home/hadoop/bigdatasoftware/hadooptmp/dfs/data ``` - **结果**:权限已成功修改为 **755**,子目录数为 **2**。 --- #### **步骤 2:在 hadoop02 节点修改权限** 1. **以 root 用户执行权限修改**: ```bash [root@hadoop02 data]# chmod 755 /home/hadoop/bigdatasoftware/hadooptmp/dfs/data [root@hadoop02 data]# exit ``` 2. **验证权限**(切换回 hadoop 用户): ```bash [hadoop@hadoop02 data]$ ls -ld /home/hadoop/bigdatasoftware/hadooptmp/dfs/data drwxr-xr-x. 3 hadoop hadoop 4096 10月 9 00:33 /home/hadoop/bigdatasoftware/hadooptmp/dfs/data ``` - **结果**:权限已成功修改为 **755**,子目录数为 **3**。 --- ### **关键分析** #### **1. 权限修复成功** - **目标权限**:`drwxr-xr-x`(755)已正确设置,确保: - **属主(hadoop)**:完全控制(读、写、执行)。 - **其他用户**:可读、可执行(避免 DataNode 进程因权限不足无法访问目录)。 --- #### **2. 子目录数量差异解释** - **hadoop03**:子目录数为 **2**(如 `current` 和 `tmp`)。 - **hadoop02**:子目录数为 **3**(可能包含额外副本或临时文件)。 - **正常现象**: DataNode 会根据数据块存储需求动态生成子目录,数量差异通常由集群负载或副本分布导致,无需干预。 --- ### **后续验证建议** #### **1. 检查所有 DataNode 节点** 确保集群中 **所有 DataNode** 的 `dfs.data.dir` 目录权限均已调整为 **755**: ```bash # 示例:检查 hadoop04 节点 ssh hadoop04 "ls -ld /home/hadoop/bigdatasoftware/hadooptmp/dfs/data" ``` --- #### **2. 验证 Hadoop 服务状态** 1. **重启 Hadoop 服务**(若之前未停止服务直接修改权限,需重启生效): ```bash stop-dfs.sh && start-dfs.sh ``` 2. **检查 DataNode 注册状态**: ```bash hdfs dfsadmin -report ``` - **预期输出**:显示所有 DataNode 的容量和状态为 `In Service`。 --- #### **3. 排查潜在问题** - **父目录权限**: 确认路径 `/home/hadoop/bigdatasoftware/hadooptmp/dfs` 的权限是否为 **755**: ```bash ls -ld /home/hadoop/bigdatasoftware/hadooptmp/dfs ``` - **修复命令**: ```bash chmod 755 /home/hadoop/bigdatasoftware/hadooptmp/dfs ``` - **SELinux 干扰**: 若系统启用 SELinux,检查上下文标签是否兼容: ```bash ls -Z /home/hadoop/bigdatasoftware/hadooptmp/dfs/data ``` - **临时解决方案**(生产环境谨慎使用): ```bash setenforce 0 # 临时禁用 SELinux ``` --- ### **总结** - **操作结果**:`hadoop02` 和 `hadoop03` 节点的 HDFS 数据目录权限已修复为 **755**,满足 Hadoop 运行要求。 - **下一步**: 1. 检查其他 DataNode 节点权限一致性。 2. 重启 Hadoop 服务并验证集群健康状态。 3. 若仍有问题,结合 DataNode 日志(`$HADOOP_HOME/logs/*datanode*.log`)进一步排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值