leetcode17 电话号码的字母组合

方法1 if-else方法 

if-else方法的思路及其简单粗暴,如下图所示,以数字234为例,数字2所对应的字母是abc,数字3所对应的是def,数字4所对应的是ghi,最后所产生的结果就类似于我们中学所学过的树状图一样,从左到右的一组一组生成结果,首先取出数字2的第一个索引对应的a,然后紧接着添加数字3对应的第一个索引的字母d,然后再添加数字4所对应的ghi,分别组成adg、adh、adi,然后一直进行排列组合,直到把所有的结果都列举完,那么就程序就执行完了。

python完整代码:

class Solution:
    def letterCombinations(self, digits):
        # 获取输入数字串的长度
        n = len(digits)
        result = []  # 用于存储最终的字母组合结果
        if n == 0:
            return result  # 如果输入为空字符串,则直接返回空列表

        for i in range(n):
            self.AddString(result, digits[i])

        return result

    def AddString(self, result, t):  # 定义一个添加字符串的函数
        n = len(result)
        letters = ""
        if t == '2':
            letters = "abc"
        elif t == '3':
            letters = "def"
        elif t == '4':
            letters = "ghi"
        elif t == '5':
            letters = "jkl"
        elif t == '6':
            letters = "mno"
        elif t == '7':
            letters = "pqrs"
        elif t == '8':
            letters = "tuv"
        elif t == '9':
            letters = "wxyz"

        if n == 0:
            result.extend(list(letters))  # 如果结果集为空,直接添加第一个数字对应的字母
        else:
            temp_result = []
            for i in range(n):  # i表示第一个数字所对应的字母的位置
                for letter in letters:
                    # 将当前结果集中的每个组合与新的字母组合,得到新的结果集
                    temp_result.append(result[i] + letter)
            result[:] = temp_result  # 用新的结果集替换原有结果集


if __name__ == "__main__":
    solution = Solution()
    combinations = solution.letterCombinations("234")
    print(combinations)

c++完整代码: 

#include<iostream>
#include<vector>

using namespace std;

class Solution{
public:
    vector<string> letterCombinations(string digits){
        int n = digits.length();  //获取输入数字串的长度
        vector<string> result; //用于存储最终的字母组合结果
        if(n == 0){
            return result;
        }
        for(int i=0;i<n;++i){
            AddString(result, digits[i]);  // 调用添加字母函数
        }
        return result;
    }
private:
    void AddString(vector<string>& result, char digit){
        int n = result.size();
        string letters = "";
        if (digit == '2'){
            letters = "abc";
        } else if(digit == '3'){
            letters = "def";
        } else if(digit == '4'){
            letters = "ghi";
        } else if(digit == '5') {
            letters = "jkl";
        } else if(digit == '6'){
            letters = "mno";
        } else if(digit == '7'){
            letters = "pqrs";
        } else if(digit == '8'){
            letters = "tuv";
        } else if(digit == '9'){
            letters = "wxyz";
        }
        if (n == 0){
            for(char letter : letters){
                result.push_back(string(1, letter));
                // 如果结果集为空,直接添加第一个数字对应的字母
            }
        } else{
           vector<string> temp_result;
           for(int i = 0;i < n; ++i){
               for(char letter : letters){
                   // 将当前结果集中的每个组合与新的字母组合,得到新的结果集
                   temp_result.push_back(result[i] + letter);
               }
           }
           result = temp_result; // 用新的结果集替换原有结果集
        }
    }
};

int main(){
    Solution solution;
    vector<string> combinations = solution.letterCombinations("234");
    for(const auto& combination : combinations){
        cout << combination << endl;
    }
    return 0;
}

java完整代码:  

import java.util.List;
import java.util.ArrayList;
public class LetterCombinations {
    public List<String> letterCombinations(String digits) {
        // 获取输入数字串的长度
        int n = digits.length();
        // 用于存储最终的字母组合结果
        List<String> list = new ArrayList();
        // 如果输入为空字符串,则直接返回空列表
        if (n == 0) {
            return list;
        }

        // 遍历每个数字字符
        for (int i = 0; i < n; i++) {
            // 调用 StringAdd 函数处理每个数字对应的字母
            StringAdd(list, digits.charAt(i));
        }
        return list;
    }

    // 定义一个添加字符串的函数
    public void StringAdd(List<String> list, char t) {
        // 获取当前结果集的长度
        int n = list.size();
        if(t == '2'){  // 处理数字 2 对应的字母组合
            if(n==0){
                list.add("a");
                list.add("b");
                list.add("c");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 'a', 'b', 'c',得到新的结果集
                    list.add(list.get(i)+"a");
                    list.add(list.get(i)+"b");
                    list.add(list.get(i)+"c");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
            // 3
        }else if(t == '3'){
            if(n==0){
                list.add("d");
                list.add("e");
                list.add("f");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 'd', 'e', 'f',得到新的结果集
                    list.add(list.get(i)+"d");
                    list.add(list.get(i)+"e");
                    list.add(list.get(i)+"f");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
            // 4
        }else if(t == '4'){
            if(n==0){
                list.add("g");
                list.add("h");
                list.add("i");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 'g', 'h', 'i',得到新的结果集
                    list.add(list.get(i)+"g");
                    list.add(list.get(i)+"h");
                    list.add(list.get(i)+"i");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
            // 5
        }else if(t == '5'){
            if(n==0){
                list.add("j");
                list.add("k");
                list.add("l");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 'j', 'k', 'l',得到新的结果
                    list.add(list.get(i)+"j");
                    list.add(list.get(i)+"k");
                    list.add(list.get(i)+"l");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
            // 6
        }else if(t == '6'){
            if(n==0){
                list.add("m");
                list.add("n");
                list.add("o");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 'm', 'n', 'o',得到新的结果
                    list.add(list.get(i)+"m");
                    list.add(list.get(i)+"n");
                    list.add(list.get(i)+"o");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
            // 7
        }else if(t == '7'){
            if(n==0){
                list.add("p");
                list.add("q");
                list.add("r");
                list.add("s");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 'p', 'q', 'r', 's',得到新的结果
                    list.add(list.get(i)+"p");
                    list.add(list.get(i)+"q");
                    list.add(list.get(i)+"r");
                    list.add(list.get(i)+"s");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
            // 8
        }else if(t == '8'){
            if(n==0){
                list.add("t");
                list.add("u");
                list.add("v");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 't', 'u', 'v',得到新的结果
                    list.add(list.get(i)+"t");
                    list.add(list.get(i)+"u");
                    list.add(list.get(i)+"v");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
            // 9
        }else if(t == '9'){
            if(n==0){
                list.add("w");
                list.add("x");
                list.add("y");
                list.add("z");
            }else{
                for(int i=0;i<n;i++){
                    // 遍历当前结果集,为每个组合添加 'w', 'x', 'y', 'z',得到新的结果
                    list.add(list.get(i)+"w");
                    list.add(list.get(i)+"x");
                    list.add(list.get(i)+"y");
                    list.add(list.get(i)+"z");
                }
                for(int i=0;i<n;i++){
                    list.remove(0);
                }
            }
        }
    }
    public static void main(String[] args){
        LetterCombinations solution = new LetterCombinations();
        List<String> combinations = solution.letterCombinations("234");
        System.out.println(combinations);
    }
}

方法2 回溯法 

上面我们讨论了通过列举的方法生成结果,但是发现程序写起来实在是太长了,而且看着很low,那么此时我们就可以把数字组合里面每一个数字所对应的字母组合通过一个篮子(哈希表)存起来,要用哪个就拿哪一个,紧接着再通过回溯的方法进行解决,以下是chatgpt所回答的回溯算法:

回溯算法(Backtracking)是一种通过尝试所有可能的候选解并在找到可行解之前放弃部分(或全部)解空间的策略。在问题的解空间中,通过深度优先搜索,一步一步地探索各个可能的解,当发现当前的部分解不能满足问题的约束条件时,就放弃该部分解,回溯到上一步,继续搜索其他可能的解。

回溯算法通常采用递归的方式实现,每一层递归代表问题的一个阶段,通过递归的深入,逐步构建出问题的解。在搜索过程中,如果当前解不满足问题的条件,则回溯到上一步,尝试其他可能的选择。

典型的回溯问题包括组合问题、排列问题、子集问题等。回溯算法通常用于解决组合优化问题,其中问题的解是某种组合的集合,而且问题通常可以分解为多个子问题,通过递归地解决子问题来构建整体的解。

关键特点:

  1. 状态空间树: 回溯算法可以通过状态空间树的形式进行表示,每个节点代表问题的一个阶段,树的每一层对应算法的一个递归调用。
  2. 深度优先搜索: 回溯算法采用深度优先搜索的策略,即一条路走到底,如果发现当前路径不能满足问题的条件,就回溯到上一步。
  3. 剪枝: 在搜索的过程中,可以通过剪枝来减少搜索空间,提高效率。当发现当前部分解无法满足问题的条件时,可以提前结束搜索。

经典的回溯问题包括八皇后问题、0-1背包问题、图的着色问题等。回溯算法的复杂度通常比较高,因此在设计时需要注意优化搜索空间以提高效率。

但是本题不存在不可行的解,所以通过穷举的方法就可以实现。该方法的思路和上述的方法基本上是一致的。

python完整代码:

class Solution:
    def letterCombinations(self, digits):
        # 如果输入为空,则直接返回空列表
        if not digits:
            return list()
        # 定义电话号码到字母的映射关系
        phoneMap = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }
        def backtrack(index):
           # 当前组合字符串长度等于输入数字串长度时,将其加入结果集
           if index == len(digits):
               combinations.append("".join(combination))  # 获取当前数字对应的字母集合
           else:
               digit = digits[index]  # 将当前字母加入组合字符串,递归调用下一层
               for letter in phoneMap[digit]:
                   combination.append(letter)
                   backtrack(index + 1)
                   # pop()函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
                   combination.pop()  # 当combinations里面存有adg,紧接着执行for letter in phoneMap[digit]:其中digit=4

        combination = list()  # 初始化组合列表和当前组合字符串
        combinations = list()
        backtrack(0)  # 初始调用回溯函数
        return combinations

if __name__ == "__main__":
    # 创建 Solution 对象
    solution = Solution()
    # 调用 letterCombinations 函数并输出结果
    combinations = solution.letterCombinations("234")
    print(combinations)
class Solution:
    def letterCombinations(self, digits):
        # 如果输入为空,则直接返回空列表
        if not digits:
            return list()
        # 定义电话号码到字母的映射关系
        phoneMap = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }
        def backtrack(index):
           # 当前组合字符串长度等于输入数字串长度时,将其加入结果集
           if index == len(digits):
               combinations.append("".join(combination))  # 获取当前数字对应的字母集合
           else:
               digit = digits[index]  # 将当前字母加入组合字符串,递归调用下一层
               for letter in phoneMap[digit]:
                   combination.append(letter)
                   backtrack(index + 1)
                   # pop()函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
                   combination.pop()  # 当combinations里面存有adg,紧接着执行for letter in phoneMap[digit]:其中digit=4

        combination = list()  # 初始化组合列表和当前组合字符串
        combinations = list()
        backtrack(0)  # 初始调用回溯函数
        return combinations

if __name__ == "__main__":
    # 创建 Solution 对象
    solution = Solution()
    # 调用 letterCombinations 函数并输出结果
    combinations = solution.letterCombinations("234")
    print(combinations)

c++完整代码:

#include<iostream>
#include<vector>
#include<unordered_map>

using namespace std;

class Solution{
public:
    vector<string> letterCombination(string digits){
        unordered_map<char, string> phoneMap = { // 定义数字对应的字母映射关系
                {'2', "abc"},
                {'3', "def"},
                {'4', "ghi"},
                {'5', "jkl"},
                {'6', "mno"},
                {'7', "pqrs"},
                {'8', "tuv"},
                {'9', "wxyz"}
        };
        // 处理特殊情况,如果输入为空字符串,则直接返回空列表
        if(digits.empty()){
            return vector<string> ();
        }
        // 用于存储最终的字母组合结果
        vector<string> result;
        // 回溯函数,参数分别为当前数字索引和当前已形成的组合字符串
        backtrack(digits,0,"",phoneMap,result);  
        //可以试试index等于1是什么结果,就能明白该参数具体指的是什么
        
        return result;
    }
private:
    // index ---> 数字所对应字母的索引
    void backtrack(const string& digits, int index, const string& path,
                   const unordered_map<char, string>& phoneMap, vector<string>& result){
        // 如果当前组合字符串的长度等于输入数字串的长度,将其加入结果集
        if(index == digits.length()){
            result.push_back(path);
            return;
        }
        // 获取当前数字对应的字母集合
        char currentDigit = digits[index];
        const string& letters = phoneMap.at(currentDigit);
        // 遍历当前数字对应的字母集合,进行递归回溯
        for(char letter : letters){
            // 将当前字母加入组合字符串,递归调用下一层
            backtrack(digits, index + 1, path + letter, phoneMap, result);
        }
    }
};

int main(){
    // 创建 Solution 对象
    Solution solution;
    // 调用 letterCombinations 函数并输出结果
    vector<string> combinations = solution.letterCombination("234");
    for(const string& combination : combinations){
        cout << combination << "" << endl;
    }
    return 0;
}

java完整代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class letterCombinations_1 {
    public List<String> letterCombinations(String digits) {
        Map<Character, String> phoneMap = new HashMap<>(); // 定义数字对应的字母映射关系
        phoneMap.put('2', "abc");
        phoneMap.put('3', "def");
        phoneMap.put('4', "ghi");
        phoneMap.put('5', "jkl");
        phoneMap.put('6', "mno");
        phoneMap.put('7', "pqrs");
        phoneMap.put('8', "tuv");
        phoneMap.put('9', "wxyz");

        // 处理特殊情况,如果输入为空字符串,则直接返回空列表
        if (digits == null || digits.isEmpty()) {
            return new ArrayList<>();
        }

        // 用于存储最终的字母组合结果
        List<String> result = new ArrayList<>();
        // 回溯函数,参数分别为当前数字索引和当前已形成的组合字符串
        backtrack(digits, 0, "", phoneMap, result);

        return result;
    }

    private void backtrack(String digits, int index, String path,
                           Map<Character, String> phoneMap, List<String> result) {
        // 如果当前组合字符串的长度等于输入数字串的长度,将其加入结果集
        if (index == digits.length()) {
            result.add(path);
            return;
        }

        // 获取当前数字对应的字母集合
        char currentDigit = digits.charAt(index);
        String letters = phoneMap.get(currentDigit);

        // 遍历当前数字对应的字母集合,进行递归回溯
        for (char letter : letters.toCharArray()) {
            // 将当前字母加入组合字符串,递归调用下一层
            backtrack(digits, index + 1, path + letter, phoneMap, result);
        }
    }

    public static void main(String[] args) {
        // 创建 Solution 对象
        letterCombinations_1 solution = new letterCombinations_1();
        // 调用 letterCombinations 函数并输出结果
        List<String> combinations = solution.letterCombinations("234");
        for (String combination : combinations) {
            System.out.println(combination);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/314998.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置

引入GLFW&#xff1a; 在vendor里创建GLFW文件夹&#xff1a; 在github上下载&#xff0c;把包下载到GLFW包下。 GitHub - TheCherno/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input修改SRC/premake5.lua的配置&#xff1a;12、13、15、36…

异地快速传输大文件的常用方法

在企业间的信息沟通与协作中&#xff0c;快速传输大文件是一项基本需求。然而&#xff0c;跨地域传输庞大文件时&#xff0c;往往面临着网络带宽、文件大小、传输速度以及数据安全等多方面的挑战。本文将介绍四种常用的异地快速传输大文件的方法&#xff0c;并分析它们的优缺点…

数据结构学习之顺序栈应用的案例(有效的括号)

实例要求&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效&#xff1b; 有效字符串需满足的条件&#xff1a; 1、左括号必须用相同类型的右括号闭合&#xff1b; 2、左括号必须…

robot_sim配置

robot_sim https://github.com/Suyixiu/robot_sim 的issue https://www.bilibili.com/video/BV19f4y1h73E/ 下评论 文件来源 其余克隆 基于几何的抓取 banana不显示 解决参考 https://github.com/Suyixiu/robot_sim/issues/2 &#xff08;项目配置主要参考&#xff09; …

LabVIEW在动态力传感器校准技术的创新应用

简介 动态力传感器校准装置集成了冲击法原理和自动化控制&#xff0c;实现精准、高效的传感器校验。LabVIEW的图形化界面提供简便操作和实时数据分析&#xff0c;显著提高了校准过程的准确度和效率。 01 系统设计和功能 动态力传感器在工业生产中发挥着重要作用&#xff0c;…

完整的模型验证套路

读取图片 from PIL import Imageimg_path "../Yennefer_of_Vengerberg.jpg" image Image.open(img_path) print(image)转换成灰度图&#xff08;可选&#xff09; image image.convert(L) image.show()转换成RGB格式 image image.convert(RGB)因为png格式是四…

软件测试|MySQL SHOW DATABASES详解

简介 在MySQL中&#xff0c;SHOW DATABASES是一条SQL语句&#xff0c;用于显示当前MySQL服务器上所有可用的数据库。这条简单而常用的命令可以让你快速查看服务器上的数据库列表。本文将详细介绍SHOW DATABASES的使用方法以及相关注意事项。 语法 在 MySQL 中&#xff0c;可…

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…

pytorch学习笔记(七 )

池化类似压缩 最大池化-上采样 例如给一个3的话就会生成一个33的窗口&#xff08;生成相同的高和宽&#xff09;&#xff0c;给一个tuple就会给出一个相同的池化核。stride默认值就是核的大小 dilation 在卷积dialation设置之后每一个会和另外的差一个&#xff0c;空洞卷积 …

微信小程序——调节手机屏幕亮度案例分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

C++核心编程——类和对象(二)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

代码随想录算法训练营第六天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解&#xff0c;一定要先看视频&#xff0c;事半功倍。写博客&#xff0c;将自己的感悟沉淀下来&#xff0c;不然会忘大家提问的时候&#xff0c;记得要把问题描述清楚&#xff0c;自己在哪一步遇到了问题&#xff0c…

嵌入式linux 编译qt5(以v851s为例)

本文参考Blev大神的博客&#xff1a;Yuzuki Lizard V851S开发板 --移植 QT5.12.9教程&#xff08;群友Blev提供&#xff09; - Allwinner / 柚木PI-V851S - 嵌入式开发问答社区 (100ask.net) 一. 环境准备 1.下载qt5源码&#xff1a;Open Source Development | Open Source …

访问学者申请需要注意什么?

访问学者申请是一项复杂而重要的过程&#xff0c;需要申请人在准备材料和过程中注意一些关键事项&#xff0c;以确保顺利完成申请并提高成功率。以下是知识人网小编的一些建议&#xff0c;希望对你的访问学者申请有所帮助。 1. 详细了解目标学术机构&#xff1a; 在申请访问学…

vscode中文插件以及运行php代码

vscode中文版插件 vscode运行php代码 1.插件安装 2.配置项 左上角文件——首选项——设置——输入php.validate.executablePath {"workbench.colorTheme": "Default Dark Modern","php.validate.executablePath": "E:/phpstudy/php.exe&q…

一篇文章带你了解Python常用自动化测试框架——Pytest!

在之前的文章里我们已经学习了Python自带测试框架UnitTest&#xff0c;但是UnitTest具有一定的局限性 这篇文章里我们来学习第三方框架Pytest&#xff0c;它在保留了UnitTest框架语法的基础上有着更多的优化处理 下面我们将从以下角度来介绍Pytest&#xff1a; Pytest基本介…

[ctf.show 元旦水友赛 2024] crypto

感觉半个多月回家没有打开过电脑了。看到ctf.show上元旦的比赛&#xff0c;才想起似乎应该看看。 月月的爱情故事 上来这就是个小脑洞题&#xff0c;给了一大段文字和一个base64的串。并且提示&#xff1a;试试摩斯吧&#xff01; 从文字上看只有三种标点符号&#xff0c;显…

【书生·浦语大模型实战营04】《(4)XTuner 大模型单卡低成本微调实战》学习笔记

《(4)XTuner 大模型单卡低成本微调实战》 课程文档&#xff1a;《XTuner 大模型单卡低成本微调实战》 1 Finetune简介 LLM的下游应用中&#xff0c;增量预训练和指令跟随是经常会用到两种的微调模式 1.1 增量预训练微调 使用场景&#xff1a;让基座模型学习到一些新知识&a…

蓝桥杯单片机组备赛——蜂鸣器和继电器的基本控制

文章目录 一、蜂鸣器和继电器电路介绍二、题目与答案2.1 题目2.2 答案2.3 重点函数解析 一、蜂鸣器和继电器电路介绍 可以发现两个电路一端都接着VCC&#xff0c;所以我们只要给另一端接上低电平就可以让蜂鸣器和继电器进行工作。与操作LED类似&#xff0c;只不过换了一个74HC5…

JWT---JSON Web Token

JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 JSON Web Token的结构是什么样的 JSON…
最新文章