diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index d366d254b8728f195fa6b8db1347696883bf7dee..fb160149d713b228a1150f71ae121c064b2f153c 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -212,6 +212,12 @@ Correction::CorrectionType Correction::processCharAndCalcState(
         const int32_t c, const bool isTerminal) {
 
     if (mNeedsToTraverseAllNodes || isQuote(c)) {
+        if (mLastCharExceeded > 0 && mInputIndex == mInputLength - 1
+                && mProximityInfo->getMatchedProximityId(mInputIndex, c, false)
+                        == ProximityInfo::SAME_OR_ACCENTED_OR_CAPITALIZED_CHAR) {
+            mLastCharExceeded = false;
+            --mExcessiveCount;
+        }
         return processSkipChar(c, isTerminal);
     }
 
@@ -312,7 +318,6 @@ Correction::CorrectionType Correction::processCharAndCalcState(
             && mExcessivePos >= 0 && (mInputIndex == mInputLength - 2);
     const bool isSameAsUserTypedLength = (mInputLength == mInputIndex + 1) || mLastCharExceeded;
     if (mLastCharExceeded) {
-        // TODO: Decrement mExcessiveCount if next char is matched word.
         ++mExcessiveCount;
     }