C++数据结构第42课、KMP算法的应用

在这里插入图片描述
1、子串查找(KMP 算法的直接应用)

int indexOf(const char* s)const;
int indexOf(const String& s)const;
int String::indexOf(const char* s)const
{
    return kmp(m_str, s ? s : "");
}

int String::indexOf(const String& s)const
{
    return kmp(m_str, s.m_str);
}
#include <iostream>
#include "XiebsString.h"

using namespace std;
using namespace XiebsLib;

int main()
{
    String s = "ababax";

    cout << s.indexOf("bax") << endl;

    return 0;
}

2、在字符串中将指定的子串删除

String& remove(int i, int len);
String& remove(const char* s);
String& remove(const String& s);
String& String::remove(int i, int len)
{
    if( (0 <= i) && (i < m_length) )
    {
        int n = i;
        int m = i + len;

        while( (n < m) && (m < m_length) )
        {
            m_str[n++] = m_str[m++];
        }

        m_str[n] = '\0';
        m_length = n;
    }

    return *this;
}

String& String::remove(const char* s)
{
    return remove(indexOf(s), s ? strlen(s) : 0);
}

String& String::remove(const String& s)
{
    return remove(indexOf(s), s.length());
}
#include <iostream>
#include "XiebsString.h"

using namespace std;
using namespace XiebsLib;

int main()
{
    String s = "ababax";

    cout << s.remove("bab").str() << endl;

    return 0;
}

3、字符串的减法操作定义(operator -)

String operator -(const String& s)const;
String operator -(const char* s)const;
String& operator -=(const String& s);
String& operator -=(const char* s);
String String::operator -(const String& s)const
{
    return String(*this).remove(s);
}

String String::operator -(const char* s)const
{
    return String(*this).remove(s);
}

String& String::operator -=(const String& s)
{
    return remove(s);
}

String& String::operator -=(const char* s)
{
    return remove(s);
}
#include <iostream>
#include "XiebsString.h"

using namespace std;
using namespace XiebsLib;

int main()
{
    String s = "ababax";

    String s1 = s - "bax";

    cout << s.str() << endl;
    cout << s1.str() << endl;

    s -= s;

    cout << "[" << s.str() << "]" << endl;

    return 0;
}

4、字符串中的子串替换

String& replace(const char* t, const char* s);
String& replace(const String& t, const char* s);
String& replace(const char* t, const String& s);
String& replace(const String& t, const String& s);
String& String::replace(const char* t, const char* s)
{
    int index = indexOf(t);
    if(index > 0)
    {
        remove(t);
        insert(index, s);
    }
    return *this;
}

String& String::replace(const String& t, const char* s)
{
    replace(t.m_str, s);
}

String& String::replace(const char* t, const String& s)
{
    replace(t, s.m_str);
}

String& String::replace(const String& t, const String& s)
{
    replace(t.m_str, s.m_str);
}
#include <iostream>
#include "XiebsString.h"

using namespace std;
using namespace XiebsLib;

int main()
{
    String s = "ababax";

    s.replace("baba", "xyz");

    cout << s.str() << endl;

    return 0;
}

5、从字符串中创建子串

String sub(int i, int len) const;
String String::sub(int i, int len) const
{
    String ret;

    if( (0 <= i) && (i < m_length) )
    {
        if( len < 0 ) len = 0;
        if( len > m_length ) len = m_length - i;
        char* str = static_cast<char*>(malloc(len + 1));

        strncpy(str, m_str + i, len);

        str[len] = '\0';

        ret = str;
    }
    else
    {
        THROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid ...");
    }

    return ret;
}
#include <iostream>
#include "XiebsString.h"

using namespace std;
using namespace XiebsLib;

int main()
{
    String s = "ababax";
    String s1 = s.sub(3, 10);
    String s2 = s.sub(2, 3);

    cout << s.str() << endl;
    cout << s1.str() << endl;
    cout << s2.str() << endl;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值