二进制字符串匹配

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=5

暴力:

#include <stdio.h>
#include <string.h>

char a[15];
char b[1005];
int len1,len2;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i,j;
        int Count=0;
        scanf("%s%s",a,b);
        len1=strlen(a);
        len2=strlen(b);
        for(i=0;i<len2-len1+1;i++)
        {
            for(j=0;j<len1;j++)
            {
                if(a[j]!=b[i+j])
                    break;
            }
            if(j==len1)
                Count++;
        }
        printf("%d\n",Count);
    }
    return 0;
}

 

STL:

 
///STL

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string p,s;
        cin>>p>>s;
        int ans=0;
        int num=0;
        ans=s.find(p,0);
        while(ans!=string::npos)
        {
            num++;
            ans=s.find(p,ans+1);
        }
        printf("%d\n",num);
    }
    return 0;
}
        

 

KMP

 

///KMP

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

char p[1005],s[1005];
int next[1005];

void getnext()///对齐p[j]
{
    int i=0,j=-1,len=strlen(p);
    next[0]=-1;
    while(i<len-1)
    {
        if(j==-1||p[i]==p[j])///如果p[i]和p[j]相等,next[i]就等于j,这样在调用next[i]时j(调用时的j)就直接到p[j]的位置了。
        {
            j++;
            i++;
            next[i]=j;
        }
        else j=next[j];///p[i]和p[j]不相等时,p[j]就从新对齐。同理p和s的比较。
    }
}

int kmp()
{
    int i=-1,j=-1,lenp=strlen(p),lens=strlen(s);
    getnext();
    int num=0;
    while(i<lens)
    {
        if(j==-1||s[i]==p[j])///s[i]和p[j]相等就往后面走
        {
            ++i;
            ++j;
        }
        else j=next[j];///s[i]和p[j]不相等就要从新对齐p[j],
        if(j==lenp)
        {
            i=i-j;
            j=-1;
            num++;
        }
    }
    return num;
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s%s",p,s);
        printf("%d\n",kmp());
    }
}

 

转载于:https://www.cnblogs.com/TreeDream/p/5322823.html

<think>好的,我现在需要解决如何在LabVIEW中将二进制字符串转换为十进制数的问题。首先,我应该回忆一下LabVIEW中处理字符串和数值转换的相关函数。 用户提到了二进制字符串,所以可能需要使用到字符串处理函数,以及进制转换的函数。LabVIEW中有没有直接可以将二进制字符串转换为十进制的函数呢? 我记得在LabVIEW的数值转换函数中,有一个“十进制数字符串至数值转换”函数,但那个可能适用于十进制的字符串。而二进制可能需要不同的处理。或者,是否存在一个更通用的函数,可以指定进制来转换? 另外,二进制字符串可能以不同的形式存在,比如是否有前缀“0b”或者只是纯二进制数字,比如“1010”。需要确保字符串格式正确,否则转换会出错。 可能步骤是:首先将二进制字符串作为输入,使用扫描值函数(Scan Value)并指定格式为二进制,或者使用“字符串至字节数组”转换,然后逐位计算十进制值。或者是否有更直接的函数? 查找资料发现,LabVIEW中的“字符串/数值转换”函数库中有“十六进制字符串至数值转换”、“十进制字符串至数值转换”等,但没有直接的二进制转换。因此,可能需要手动处理,或者使用格式化字符串函数。 另一种方法是使用“格式化值”函数,将二进制字符串作为输入,并指定格式为二进制,但反过来可能不行。或者是否可以使用“扫描字符串”函数,设置格式说明符为%b,这样可以将二进制字符串转换为数值? 例如,使用“扫描值”函数(Scan from String),将格式字符串设置为%t%b,这样读取二进制字符串。或者可能需要用%x处理十六进制,但二进制可能需要不同的格式符。 或者,使用“字符串至字节数组”转换,然后对每个字符进行处理,确认是否为'0'或'1',然后逐位计算数值。例如,从高位到低位遍历每个字符,计算对应的十进制值。 比如二进制字符串“1011”转换为十进制应该是11。手动计算的话,1*2^3 + 0*2^2 +1*2^1 +1*2^0=8+0+2+1=11。 那么,在LabVIEW中如何实现这个过程?可能需要将字符串拆分为字符数组,然后反转(因为最低位在右边),然后循环每个字符,乘以对应的2的幂次,再累加。 具体步骤可能如下: 1. 使用“字符串至字节数组”函数将二进制字符串转换为字节数组。 2. 检查每个字节是否为'0'或'1',如果有其他字符则报错。 3. 反转数组,使得从最低位开始处理。 4. 使用循环,逐位计算该位的值(0或1)乘以2的索引次方,然后累加到结果中。 5. 最后得到十进制数值。 或者是否有更简洁的方法?比如使用现有的VI或函数。例如,在LabVIEW的数值转换中,有一个“数值至二进制字符串转换”函数,但反向的可能需要自己处理。 另外,LabVIEW 2017或更高版本是否有新增的二进制转换函数?需要确认用户使用的版本,但假设用户可能没有最新版本,所以使用基础方法更可靠。 还有一种可能,将二进制字符串转换为十六进制字符串,然后利用十六进制至数值转换函数。例如,二进制“1011”转换为十六进制是B,然后转换为十进制的11。但这种方法需要填充二进制字符串到4的倍数长度,前面补零,然后分段转换。这可能比较复杂,但可能可行。 不过这可能比直接逐位计算更麻烦,特别是对于较长的二进制字符串。 总结可能的两种方法: 1. 使用“扫描值”函数,配合正确的格式字符串,如%b,直接将二进制字符串转换为数值。 2. 手动逐位解析二进制字符串,计算十进制值。 现在需要验证第一种方法是否可行。查阅LabVIEW帮助文档,发现扫描值函数支持的格式说明符中,%b用于读取二进制整数。例如,格式字符串为“%b”时,输入字符串“1011”会被转换为十进制的11。因此,可能用户只需要使用扫描值函数,将二进制字符串作为输入,并指定格式为%b,即可得到数值。 具体步骤: 1. 将二进制字符串连接到扫描值函数的输入。 2. 在格式字符串中输入%b。 3. 输出即为对应的十进制数值。 这样可能非常简便,不需要复杂的处理。例如,在LabVIEW中,可以使用“扫描字符串”(Scan from String)函数,设置格式为%b,然后输入二进制字符串,输出数值。 这可能就是正确的解决方案。例如,用户输入二进制字符串“1101”,扫描值函数使用%b格式,输出13。 因此,正确的步骤应该是使用扫描值函数,设置格式为%b,从而转换二进制字符串为十进制数。需要确保输入的字符串只包含有效的二进制字符(0和1),否则会出错或者返回部分结果。 所以,最终的解决方案是使用扫描值函数,格式字符串设为%b,输入二进制字符串,输出十进制数值。 为了验证,在LabVIEW中创建一个VI,前面板放置一个字符串输入控件,输入二进制字符串,后面板连接扫描值函数,格式为%b,然后显示输出数值。测试输入“1010”,应输出10,输入“1111”应输出15,测试是否正确。 如果这种方法有效,那这就是最简单的实现方式。否则,可能需要手动解析。 另外,需要考虑错误处理,比如字符串中有非0或1的字符,扫描值函数是否会返回错误。这时候可能需要先验证输入的二进制字符串是否有效,比如使用匹配模式函数,或者正则表达式检查是否只包含0和1。 总结步骤: 1. 使用扫描值函数(Scan from String),格式字符串为%b。 2. 输入二进制字符串,输出对应的十进制数。 3. 添加错误处理,确保输入字符串有效。 如果用户需要处理带有符号位的二进制字符串(如负数),可能需要不同的处理,但通常LabVIEW的%b格式应该支持有符号数的转换,根据字符串是否有负号。但用户的问题可能仅涉及无符号二进制字符串。 因此,正确的LabVIEW实现方法就是使用扫描值函数,格式设为%b。</think>在LabVIEW中,将二进制字符串转换为十进制数可通过以下步骤实现: 1. **使用`扫描值`函数(Scan from String)** 将二进制字符串连接到`扫描值`函数的输入端口,并将格式字符串设置为`%b`。该函数会直接解析二进制字符串并返回十进制数值[^1]。例如,输入字符串`"1010"`将被转换为数值`10`。 ```plaintext [LabVIEW代码框图示例] 二进制字符串输入 --> [扫描值](格式:%b) --> 十进制数值输出 ``` 2. **错误处理与验证** 若字符串包含非二进制字符(如`2`或`a`),`扫描值`会返回错误。可通过正则表达式或`匹配模式`函数预先检查字符串是否仅包含`0`和`1`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值