算法训练——字符串映射

每日一练

        给你一种规律 pattern 和一个字符串 s,请你判断 s 是否和 pattern 的规律相匹配。
如果存在单个字符到字符串的 双射映射 ,那么字符串 s 匹配 pattern ,即:如果pattern 中的每个字符都被它映射到的字符串替换,那么最终的字符串则为 s 。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。

示例 1:
        输入:pattern = "abab", s = "redblueredblue"输出:true解释:一种可能的映射如下:'a' -> "red"'b' -> "blue"

示例 2:
        输入:pattern = "aaaa", s = "asdasdasdasd"输出:true解释:一种可能的映射如下:'a' -> "asd"

示例 3:
        输入:pattern = "aabb", s = "xyzabcxzyabc"输出:false

提示:
        1 <= pattern.length, s.length <= 20pattern 和 s 由小写英文字母组成

解答:采用dfs分割子串

public class Day7 {
    public static void main(String[] args) {
//        String s = "abcabc";
//        new Day7().solution("aa",s,0,0);
//        new Day7().solution("abab","redblueredblue",0,0);
//        new Day7().solution("abab","xyzabcxzyabc",0,0);
        new Day7().solution("aaaa","asdasdasdasd",0,0);
        System.out.println(flag);

    }


    ArrayList<String> list = new ArrayList<>();
    static boolean flag = false;
    //暴力切割成指定块,找到匹配的一次,若没有,那么返回false
    public void solution(String s, String pattern, int start, int deep) {
        if (flag) return;
        if (deep == s.length() ) {//一一比对
            for (int i = 0; i < s.length(); i++) {
                for (int j = i + 1; j < s.length(); j++) {
                    if (s.charAt(i) == s.charAt(j)) {
                        if (list.get(i) != null && !list.get(i).equals(list.get(j))) {
                            return;
                        }
                    }
                }
            }
            flag = true;
            return;
        }

        for (int i = start; i < pattern.length() - s.length() + deep + 1; i++) {
            if (deep == s.length() - 1){
                list.add(pattern.substring(start).intern());
                solution(s, pattern, i + 1, deep + 1);
                list.remove(deep);
                break;
            }
            list.add(pattern.substring(start, i + 1).intern());
            solution(s, pattern, i + 1, deep + 1);
            list.remove(deep);
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用哈希表实现字符串映射,具体步骤如下: 1. 创建一个哈希表,用来存储映射关系。 2. 遍历第一个字符串,将每个字符和对应位置上的字符在第二个字符串中的索引存入哈希表中。 3. 遍历第二个字符串,将每个字符和对应位置上的字符在第一个字符串中的索引存入哈希表中。 4. 遍历第一个字符串,通过哈希表查找第二个字符串中对应位置上的字符的索引,即可完成映射。 代码示例: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 256 typedef struct node { char key; int value; struct node *next; } Node; Node *hashTable[MAX_LEN]; int hash(char key) { return (int) key % MAX_LEN; } void put(char key, int value) { int index = hash(key); Node *p = hashTable[index]; while (p != NULL) { if (p->key == key) { p->value = value; return; } p = p->next; } Node *newNode = (Node *) malloc(sizeof(Node)); newNode->key = key; newNode->value = value; newNode->next = hashTable[index]; hashTable[index] = newNode; } int get(char key) { int index = hash(key); Node *p = hashTable[index]; while (p != NULL) { if (p->key == key) { return p->value; } p = p->next; } return -1; } void strmap(char *str1, char *str2) { int len = strlen(str1); for (int i = 0; i < len; i++) { put(str1[i], i); } len = strlen(str2); for (int i = 0; i < len; i++) { int index = get(str2[i]); if (index != -1) { printf("%c -> %c\n", str1[index], str2[i]); } } } int main() { char str1[] = "abcde"; char str2[] = "edcba"; strmap(str1, str2); return 0; } ``` ### 回答2: 在Linux C中实现两个字符串映射可以通过哈希表来实现。首先,需要定义一个哈希表的数据结构,可以使用数组加链表的方式来实现。接着,我们需要实现以下几个函数: 1. 哈希函数:将字符串转化为一个唯一的整数,例如可以使用字符串的ASCII码之和来作为哈希值。 2. 插入函数:将字符串及其对应的映射值插入到哈希表中。如果哈希表中已经存在相同的字符串,则更新其映射值。 3. 查找函数:根据给定的字符串,在哈希表中查找对应的映射值。如果找到,返回映射值;如果没有找到,返回一个特定的值,表示未找到。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TABLE_SIZE 1000 typedef struct node { char key[100]; int value; struct node* next; } HashNode; typedef struct { HashNode* table[MAX_TABLE_SIZE]; } HashMap; int hash(const char* str) { int sum = 0; for (int i = 0; i < strlen(str); i++) { sum += str[i]; } return sum % MAX_TABLE_SIZE; } void insert(HashMap* map, const char* key, int value) { int index = hash(key); HashNode* newNode = (HashNode*)malloc(sizeof(HashNode)); strcpy(newNode->key, key); newNode->value = value; newNode->next = NULL; HashNode* curNode = map->table[index]; if (curNode == NULL) { map->table[index] = newNode; } else { while (curNode->next != NULL) { if (strcmp(curNode->key, key) == 0) { curNode->value = value; free(newNode); return; } curNode = curNode->next; } if (strcmp(curNode->key, key) == 0) { curNode->value = value; free(newNode); return; } curNode->next = newNode; } } int find(HashMap* map, const char* key) { int index = hash(key); HashNode* curNode = map->table[index]; while (curNode != NULL) { if (strcmp(curNode->key, key) == 0) { return curNode->value; } curNode = curNode->next; } return -1; // 未找到对应的映射值 } int main() { HashMap map; memset(&map, 0, sizeof(map)); insert(&map, "Hello", 10); insert(&map, "World", 20); int value1 = find(&map, "Hello"); printf("Value of Hello: %d\n", value1); int value2 = find(&map, "World"); printf("Value of World: %d\n", value2); int value3 = find(&map, "Linux"); printf("Value of Linux: %d\n", value3); return 0; } ``` 以上示例代码只是实现了简单的字符串映射功能,可以根据实际需求进行更加复杂的扩展和优化。 ### 回答3: 在Linux上使用C语言实现两个字符串映射可以通过使用哈希表来实现。哈希表是一种常见的数据结构,可以快速存储和查找数据。 首先,我们需要创建一个哈希表的数据结构,其中包含一个固定大小的数组和相应的哈希函数。哈希函数可以将字符串转化为一个唯一的整数,作为数组的下标。 接下来,我们可以使用哈希函数将第一个字符串映射到哈希表的特定位置,并将其存储在该位置上。如果该位置已经被占用,则需要处理冲突。常见的处理冲突的方法有链地址法和开放地址法。 对于第二个字符串,我们可以使用相同的哈希函数将其映射到哈希表上,并查找该位置是否已经存储了另一个字符串。如果存在,则说明这两个字符串发生了映射。 在查找字符串映射关系时,我们也可以按照相同的步骤,首先通过哈希函数找到哈希表中的位置,并在该位置上查找是否存在另一个字符串。 需要注意的是,哈希表的大小需要根据实际情况设置,通常是根据字符串的长度和映射的数量。 总结起来,通过设计和实现哈希表的数据结构,并使用哈希函数将字符串映射到特定位置,我们可以在Linux上使用C语言实现两个字符串映射

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aristocrat l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值