位运算法:字符串 A 和 B 是否为兄弟,是否包含问题

例如:

    char *stra = "abc";
    char *strb = "bca";
    char *strc = "rfdabcgg";
    char *strd = "bca";

stra 和 strb 为兄弟字符串

strc 包含 strd


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

int is_brother(char *a , char *b)
{
    int flag = 0;
    int i;

    if (strlen(a) != strlen(b))
        return 0;

    for ( i = 0; i< strlen(a); i++ ) {
        flag |= (1 << (*(a + i) - 'A'));
    }

    for ( i = 0; i < strlen(b); i++ ) {
        if( (flag & (1 << (*(b +i) - 'A'))) == 0)
            return 0;
    }

    return 1;
}
int stringcontain(char *a_long, char *b_short)
{
    int flag = 0;
    int i;
    for ( i = 0; i< strlen(a_long); i++ ) {
        flag |= (1 << (*(a_long + i) - 'A'));
    }

    for ( i = 0; i < strlen(b_short); i++ ) {
        if( (flag & (1 << (*(b_short +i) - 'A'))) == 0)
            return 0;
    }

    return 1;

}

int main( int argc, char **argv )
{
    char *stra = "abc";
    char *strb = "bca";
    char *strc = "rfdabcgg";
    char *strd = "bca";

    printf( "1 == True \n 0 == Flse \n" );
    printf( "stra and strb is_brother = %d\n", is_brother(stra, strb) );
    printf( "strc contain std = %d\n", stringcontain(strc,strd) );

    return 0;
}




1. 定义节点结构体 我们可以先定义节点结构体,包含一个数据域两个指针域,一个指向子表,一个指向兄弟节点。 ```c++ struct Node { char data; // 数据域,存储字符 Node* child; // 指向子表的指针 Node* sibling; // 指向兄弟节点的指针 }; ``` 2. 构造算 接下来我们可以设计算,将字符串形式表示的广义表转换成链表存储结构。 ```c++ Node* createList(string s) { stack<Node*> st; // 用栈来存储节点 Node* root = nullptr; // 根节点指针初始化为空 Node* cur = nullptr; // 当前节点指针初始化为空 bool isChild = false; // 标记是否为子表 for (int i = 0; i < s.size(); i++) { if (s[i] == '(') { isChild = true; // 进入子表 } else if (s[i] == ')') { st.pop(); // 子表结束,出栈 } else if (s[i] == ',') { isChild = false; // 兄弟节点开始 } else { cur = new Node(); // 新建一个节点 cur->data = s[i]; // 节点存储字符 cur->child = nullptr; // 子表指针初始化为空 cur->sibling = nullptr; // 兄弟节点指针初始化为空 if (st.empty()) { // 根节点为空,将当前节点作为根节点 root = cur; } else if (isChild) { // 当前节点为子表 st.top()->child = cur; // 将当前节点作为父节点的子节点 } else { // 当前节点为兄弟节点 st.top()->sibling = cur; // 将当前节点作为上一个兄弟节点的下一个兄弟节点 } st.push(cur); // 将当前节点入栈,以便后续节点的处理 } } return root; // 返回根节点指针 } ``` 3. 测试 我们可以定义一个字符串表示广义表,然后调用函数将其转化为链表存储结构,并遍历输出。 ```c++ int main() { string s = "(a,(b,c,d),(e,f))"; Node* root = createList(s); traverse(root); return 0; } ``` 其中,`traverse`函数可以用来遍历链表,输出其中的每个节点。 ```c++ void traverse(Node* root) { if (root == nullptr) { return; } cout << root->data << " "; traverse(root->child); traverse(root->sibling); } ``` 输出结果为: ``` a b c d e f ``` 表示成功将广义表转化为链表存储结构,并正确输出其中的每个节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值