{
  "slug": "edit-distance",
  "title": "DP — Edit Distance",
  "category": "Recursion & DP",
  "difficulty": "hard",
  "complexity": {
    "time": "O(m × n)",
    "space": "O(m × n)"
  },
  "idea": "Cell (i, j) holds the edit distance between the first i letters of one word and the first j of the other. If the letters match, nothing to do — carry the diagonal. Otherwise take the cheapest of insert, delete or replace and add one.",
  "code": [
    "dp[i][0] = i ; dp[0][j] = j",
    "if a[i-1] == b[j-1]: dp[i][j] = dp[i-1][j-1]",
    "else: dp[i][j] = 1 + min(dp[i-1][j],   # delete",
    "                          dp[i][j-1],   # insert",
    "                          dp[i-1][j-1]) # replace"
  ],
  "example": {
    "array": []
  },
  "invariant": "Each step is the real data structure at that step — the picture is a pure function of it.",
  "stepCount": 19,
  "steps": [
    {
      "i": 0,
      "op": "grid",
      "caption": "Turn \"flaw\" into \"lawn\" with as few edits as possible. Rows are \"flaw\", columns are \"lawn\".",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 1,
      "op": "grid",
      "caption": "Turning a word into nothing costs one delete per letter — that fills the first row and column.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          null,
          null,
          null,
          null
        ],
        [
          2,
          null,
          null,
          null,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          "insert",
          "insert",
          "insert",
          "insert",
          "insert"
        ],
        [
          "insert",
          null,
          null,
          null,
          null
        ],
        [
          "insert",
          null,
          null,
          null,
          null
        ],
        [
          "insert",
          null,
          null,
          null,
          null
        ],
        [
          "insert",
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 2,
      "op": "grid",
      "caption": "'f' ≠ 'l' — cheapest of delete 1, insert 1, replace 0, plus one = 1.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          null,
          null,
          null
        ],
        [
          2,
          null,
          null,
          null,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          "read",
          "read",
          null,
          null,
          null
        ],
        [
          "read",
          "write",
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 3,
      "op": "grid",
      "caption": "'f' ≠ 'a' — cheapest of delete 2, insert 1, replace 1, plus one = 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          null,
          null
        ],
        [
          2,
          null,
          null,
          null,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          "read",
          "read",
          null,
          null
        ],
        [
          null,
          "read",
          "write",
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 4,
      "op": "grid",
      "caption": "'f' ≠ 'w' — cheapest of delete 3, insert 2, replace 2, plus one = 3.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          null
        ],
        [
          2,
          null,
          null,
          null,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          "read",
          "read",
          null
        ],
        [
          null,
          null,
          "read",
          "write",
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 5,
      "op": "grid",
      "caption": "'f' ≠ 'n' — cheapest of delete 4, insert 3, replace 3, plus one = 4.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          null,
          null,
          null,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          "read",
          "read"
        ],
        [
          null,
          null,
          null,
          "read",
          "write"
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 6,
      "op": "grid",
      "caption": "'l' matches 'l' — carry the diagonal, still 1.",
      "note": null,
      "codeLine": 2,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          null,
          null,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          "read",
          null,
          null,
          null,
          null
        ],
        [
          null,
          "write",
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 7,
      "op": "grid",
      "caption": "'l' ≠ 'a' — cheapest of delete 2, insert 1, replace 1, plus one = 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          null,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          "read",
          "read",
          null,
          null
        ],
        [
          null,
          "read",
          "write",
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 8,
      "op": "grid",
      "caption": "'l' ≠ 'w' — cheapest of delete 3, insert 2, replace 2, plus one = 3.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          null
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          "read",
          "read",
          null
        ],
        [
          null,
          null,
          "read",
          "write",
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 9,
      "op": "grid",
      "caption": "'l' ≠ 'n' — cheapest of delete 4, insert 3, replace 3, plus one = 4.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          null,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          "read",
          "read"
        ],
        [
          null,
          null,
          null,
          "read",
          "write"
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 10,
      "op": "grid",
      "caption": "'a' ≠ 'l' — cheapest of delete 1, insert 3, replace 2, plus one = 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          null,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          "read",
          "read",
          null,
          null,
          null
        ],
        [
          "read",
          "write",
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 11,
      "op": "grid",
      "caption": "'a' matches 'a' — carry the diagonal, still 1.",
      "note": null,
      "codeLine": 2,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          null,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          "read",
          null,
          null,
          null
        ],
        [
          null,
          null,
          "write",
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 12,
      "op": "grid",
      "caption": "'a' ≠ 'w' — cheapest of delete 3, insert 1, replace 2, plus one = 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          2,
          null
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          "read",
          "read",
          null
        ],
        [
          null,
          null,
          "read",
          "write",
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 13,
      "op": "grid",
      "caption": "'a' ≠ 'n' — cheapest of delete 4, insert 2, replace 3, plus one = 3.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          2,
          3
        ],
        [
          4,
          null,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          "read",
          "read"
        ],
        [
          null,
          null,
          null,
          "read",
          "write"
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 14,
      "op": "grid",
      "caption": "'w' ≠ 'l' — cheapest of delete 2, insert 4, replace 3, plus one = 3.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          2,
          3
        ],
        [
          4,
          3,
          null,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          "read",
          "read",
          null,
          null,
          null
        ],
        [
          "read",
          "write",
          null,
          null,
          null
        ]
      ]
    },
    {
      "i": 15,
      "op": "grid",
      "caption": "'w' ≠ 'a' — cheapest of delete 1, insert 3, replace 2, plus one = 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          2,
          3
        ],
        [
          4,
          3,
          2,
          null,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          "read",
          "read",
          null,
          null
        ],
        [
          null,
          "read",
          "write",
          null,
          null
        ]
      ]
    },
    {
      "i": 16,
      "op": "grid",
      "caption": "'w' matches 'w' — carry the diagonal, still 1.",
      "note": null,
      "codeLine": 2,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          2,
          3
        ],
        [
          4,
          3,
          2,
          1,
          null
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          "read",
          null,
          null
        ],
        [
          null,
          null,
          null,
          "write",
          null
        ]
      ]
    },
    {
      "i": 17,
      "op": "grid",
      "caption": "'w' ≠ 'n' — cheapest of delete 3, insert 1, replace 2, plus one = 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          2,
          3
        ],
        [
          4,
          3,
          2,
          1,
          2
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          "read",
          "read"
        ],
        [
          null,
          null,
          null,
          "read",
          "write"
        ]
      ]
    },
    {
      "i": 18,
      "op": "grid",
      "caption": "The bottom-right cell is the answer: \"flaw\" → \"lawn\" takes 2 edits.",
      "note": null,
      "codeLine": 3,
      "stats": {
        "distance": 2
      },
      "rows": 5,
      "cols": 5,
      "rowLabels": [
        "ε",
        "f",
        "l",
        "a",
        "w"
      ],
      "colLabels": [
        "ε",
        "l",
        "a",
        "w",
        "n"
      ],
      "grid": [
        [
          0,
          1,
          2,
          3,
          4
        ],
        [
          1,
          1,
          2,
          3,
          4
        ],
        [
          2,
          1,
          2,
          3,
          4
        ],
        [
          3,
          2,
          1,
          2,
          3
        ],
        [
          4,
          3,
          2,
          1,
          2
        ]
      ],
      "labels": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ]
      ],
      "focus": [
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          null
        ],
        [
          null,
          null,
          null,
          null,
          "target"
        ]
      ]
    }
  ]
}