矩阵中不断增长的子串的长度

Posted

技术标签:

【中文标题】矩阵中不断增长的子串的长度【英文标题】:Length of a growing substring in matrix 【发布时间】:2022-01-14 16:25:22 【问题描述】:

例如,给定一个方阵,找出正在增长的子字符串的长度。

matrix     |      result       because of
5          |
1 2 3 4 5  |
2 5 2 5 9  |    
7 8 9 0 1 -->       5     -->   1 2 3 4 5
0 0 0 0 0  |
2 3 6 1 2  |

我尝试将a[i][j]a[i][j+1] 进行比较并增加计数器,但我认为我的问题是当程序在最终元素上并且它不增加计数器时。 这里有我的代码:

int main()
    int n;
    scanf("%d",&n);
    int i,j,a[n][n];
    for(i = 0;i < n;i++)
        for(j = 0;j <n;j++)
            scanf("%d",&a[i][j]);
        
    
    int max=-9999;
    int counter;
    for(i = 0;i < n;i++)
        counter=0;
        for(j = 0;j <n;j++)
            if(a[i][j]<a[i][j+1])
                counter++;
            
            if(counter>max)
                max = counter;
            
        
    
    printf("%d",max);
    return 0;

【问题讨论】:

j 达到最大值时(n - 1),表达式a[i][j+1] 调用Undefined Behaviour,因为元素a[i][n] 不存在(a[i]从索引0n - 1)。 它是方阵有什么意义?它可以“展平”为一个简单的一维数组。 @EugeneSh。这是作业问题,它特别告诉我们应该使用矩阵 最长增长的子串可以跨越多行吗?它总是在水平方向吗?这个问题似乎没有明确说明。 @ggolen 只是水平的并排成一行 【参考方案1】:

对于初学者来说,索引范围不能为负数,因此将变量 max 声明为负值是没有意义的

int max=-9999;

至少可以像这样初始化

int max = 0;

在这个if语句中

if(a[i][j]<a[i][j+1])

由于表达式a[i][j+1],当ij 等于n - 1 时,可以访问分配的数组之外的内存。

还有这个 if 语句

        if(counter>max)
            max = counter;
        

应该移到内部 if 语句之外。

并且变量count应该在外循环中声明

您可以通过以下方式重写内部 for 循环

    int counter=1;
    for(j = 1;j <n;j++)
        if(a[i][j-1]<a[i][j])
            counter++;
        
    
    if(counter>max)
        max = counter;
    

【讨论】:

你能解释一下为什么 counter 和 j 从 1 开始吗? @itmemilan 包含一个元素的序列是具有一个元素的增长序列。:)

以上是关于矩阵中不断增长的子串的长度的主要内容,如果未能解决你的问题,请参考以下文章

查找字符串的子串,使得子串的长度与其出现次数的乘积最大化

leetcode 每日一题 30. 串联所有单词的子串

leetcode 每日一题 30. 串联所有单词的子串

最短假子串

华为机试真题 C++ 实现求满足条件的最长子串的长度

华为OD机试真题 Python 实现求满足条件的最长子串的长度